使用列表替换numpy数组中的值的最快方法

时间:2022-12-27 21:21:39

I want to read a list into a numpy array. This list is being replaced in every iteration of a loop and further operations are done on the array. These operations include element-wise subtraction from another numpy array for a distance measure, and checking a threshold condition in this distance using the numpy.all() function. Currently I am using np.array( list ) each time to convert the list to an array:

我想把列表读成一个numpy数组。这个列表在循环的每次迭代中被替换,并且在阵列上进行进一步的操作。这些操作包括从另一个numpy数组中逐行减去距离测量,并使用numpy.all()函数检查此距离的阈值条件。目前我每次都使用np.array(list)将列表转换为数组:

#!/usr/bin/python
import numpy as np
a = [1.33,2.555,3.444,5.666,4.555,6.777,8.888]
%timeit b = np.array(a)

100000 loops, best of 3: 4.83 us per loop

Is it possible to do anything better than this, if I know the size of the list and it is invariable? Even small improvements are welcome, as I run this a very large number of times.

如果我知道列表的大小并且它是不变的,是否可以做更好的事情呢?即使很小的改进也是值得欢迎的,因为我经常这么做很多次。

I've tried %timeit(np.take(a,range(len(a)),out=b)) which takes much longer: 100000 loops, best of 3: 16.8 us per loop

我已经尝试了%timeit(np.take(a,range(len(a)),out = b))这需要更长的时间:100000个循环,最好的3:每个循环16.8 us

1 个解决方案

#1


As you "know the size of the list and it is invariable", you can set up an array first:

当你“知道列表的大小并且它是不变的”时,你可以先设置一个数组:

b = np.zeros((7,))

This then works faster:

这样可以更快地运行:

%timeit b[:] = a
1000000 loops, best of 3: 1.41 µs per loop

vs

%timeit b = np.array(a)
1000000 loops, best of 3: 1.67 µs per loop

#1


As you "know the size of the list and it is invariable", you can set up an array first:

当你“知道列表的大小并且它是不变的”时,你可以先设置一个数组:

b = np.zeros((7,))

This then works faster:

这样可以更快地运行:

%timeit b[:] = a
1000000 loops, best of 3: 1.41 µs per loop

vs

%timeit b = np.array(a)
1000000 loops, best of 3: 1.67 µs per loop