gpt4 book ai didi

python - 从单个值 : Fast and readable method? 构建一个小的 numpy 数组

转载 作者:太空狗 更新时间:2023-10-29 17:33:13 25 4
gpt4 key购买 nike

我发现我的程序中的一个瓶颈是从给定值列表创建 numpy 数组,最常见的是将四个值放入一个 2x2 数组中。有一种显而易见、易于阅读的方法:

my_array = numpy.array([[1, 3], [2.4, -1]])

这需要 15 秒——非常非常慢,因为我已经做了数百万次。

还有一种更快、更难读的方法:

my_array = numpy.empty((2,2))
my_array[0,0] = 1
my_array[0,1] = 3
my_array[1,0] = 2.4
my_array[1,1] = -1

速度提高了 10 倍,仅需 1 微秒。

有没有既快速又易于阅读的方法?

到目前为止我尝试了什么:使用 asarray 而不是 array 没有区别;将 dtype=float 传递给 array 也没有区别。最后,我明白我可以自己做:

def make_array_from_list(the_list, num_rows, num_cols):
the_array = np.empty((num_rows, num_cols))
for i in range(num_rows):
for j in range(num_cols):
the_array[i,j] = the_list[i][j]
return the_array

这将在 4us 内创建数组,这是中等速度的中等可读性(与上述两种方法相比)。但说真的,我无法相信使用内置方法没有更好的方法。

提前致谢!

最佳答案

这是一个很好的问题。我找不到任何可以接近您完全展开的解决方案速度的东西(编辑 @BiRico 能够想出一些接近的东西。查看评论和更新 :)。以下是我(和其他人)提出的一系列不同选项以及相关的时间安排:

import numpy as np

def f1():
"np.array + nested lists"
my_array = np.array([[1, 3], [2.4, -1]])

def f2():
"np.array + nested tuples"
my_array = np.array(((1, 3), (2.4, -1)))

def f3():
"Completely unrolled"
my_array = np.empty((2,2),dtype=float)
my_array[0,0] = 1
my_array[0,1] = 3
my_array[1,0] = 2.4
my_array[1,1] = -1

def f4():
"empty + ravel + list"
my_array = np.empty((2,2),dtype=float)
my_array.ravel()[:] = [1,3,2.4,-1]

def f5():
"empty + ravel + tuple"
my_array = np.empty((2,2),dtype=float)
my_array.ravel()[:] = (1,3,2.4,-1)

def f6():
"empty + slice assignment"
my_array = np.empty((2,2),dtype=float)
my_array[0,:] = (1,3)
my_array[1,:] = (2.4,-1)

def f7():
"empty + index assignment"
my_array = np.empty((2,2),dtype=float)
my_array[0] = (1,3)
my_array[1] = (2.4,-1)

def f8():
"np.array + flat list + reshape"
my_array = np.array([1, 3, 2.4, -1]).reshape((2,2))

def f9():
"np.empty + ndarray.flat (Pierre GM)"
my_array = np.empty((2,2), dtype=float)
my_array.flat = (1,3,2.4,-1)

def f10():
"np.fromiter (Bi Roco)"
my_array = np.fromiter((1,3,2.4,-1), dtype=float).reshape((2,2))

import timeit
results = {}
for i in range(1,11):
func_name = 'f%d'%i
my_import = 'from __main__ import %s'%func_name
func_doc = globals()[func_name].__doc__
results[func_name] = (timeit.timeit(func_name+'()',
my_import,
number=100000),
'\t'.join((func_name,func_doc)))

for result in sorted(results.values()):
print '\t'.join(map(str,result))

重要的时间点:

在 Ubuntu Linux 上,Core i7:

0.158674955368  f3  Completely unrolled
0.225094795227 f10 np.fromiter (Bi Roco)
0.737828969955 f8 np.array + flat list + reshape
0.782918930054 f5 empty + ravel + tuple
0.786983013153 f9 np.empty + ndarray.flat (Pierre GM)
0.814703941345 f4 empty + ravel + list
1.2375421524 f7 empty + index assignment
1.32230591774 f2 np.array + nested tuples
1.3752617836 f6 empty + slice assignment
1.39459013939 f1 np.array + nested lists

关于python - 从单个值 : Fast and readable method? 构建一个小的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13131220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com