从另一个包含选择索引的NumPy数组中扩展NumPy阵列的最快方法



我必须使用原始数组的一组索引,从已知数组创建一个大数组。索引被存储为ndarray,为了构建新的数组,我正在做这样的事情:

import numpy as np
dim_1       = 200
high_index  = 1000 
dim_2       = 300
masks_array = np.random.randint( low = 0, high = high_index - 1, size=(high_index, dim_1) )
the_array   = np.random.rand( high_index, dim_2 )
new_array   = np.array( [ the_array[ masks_array[ j, : ], :  ] for j in range(high_index) ]  )

这是从masks_array生成new_array的最快方法吗?有没有一种方法可以在没有循环的情况下做到这一点?出于兴趣;对于";循环在np.array构造函数中,这是否转化为Python中的高效循环(类似于列表理解(?

In [198]: dim_1       = 200
...: high_index  = 1000
...: dim_2       = 300
...: 
...: masks_array = np.random.randint( low = 0, high = high_index - 1, size=
...: (high_index, dim_1) )
...: the_array   = np.random.rand( high_index, dim_2 )
...: 
...: new_array   = np.array( [ the_array[ masks_array[ j, : ], :  ] for j i
...: n range(high_index) ]  )
In [199]: new_array.shape
Out[199]: (1000, 200, 300)
In [200]: masks_array.shape
Out[200]: (1000, 200)
In [201]: the_array.shape
Out[201]: (1000, 300)

让我们尝试使用masks_array:进行简单的索引

In [205]: arr = the_array[masks_array,:]
In [206]: arr.shape
Out[206]: (1000, 200, 300)
In [207]: np.allclose(new_array, arr)
Out[207]: True

时间比较:

In [213]: timeit new_array = np.array([the_array[masks_array[j,:],:] for j in ra
...: nge(high_index)])
658 ms ± 17.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [214]: timeit arr = the_array[masks_array,:]
292 ms ± 65.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

我怀疑,由于结果的整体规模较大,节省的时间并不多。

这是python,np.array是一个函数。所以

[the_array[masks_array[j,:],:] for j in range(high_index)] 

首先进行评估,然后传递给`np.array.

In [215]: timeit [the_array[masks_array[j,:],:] for j in range(high_index)]
369 ms ± 7.94 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

最新更新