Python 从numpy数组中获取索引并应用于第二个低维数组以创建新数组
我有一个数组Python 从numpy数组中获取索引并应用于第二个低维数组以创建新数组,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,我有一个数组Gamma,Gamma.shape=(20,7,90144),它表示维度(t,z,y,x),其各自的索引由[l,k,j,I]表示。对于每个(t,y,x),我想找到k的最小值,这样Gamma[l,k,j,I]>g_crit,其中g_crit是一个常数。将这组最低的k值表示为k_low;我发现我可以很好地用 k_low = np.argmax(Gamma > g_crit, axis=1) 还有另一个数组levs,levs.shape=(7,),也对应于z维度。我最终尝试创建数组
Gamma
,Gamma.shape=(20,7,90144)
,它表示维度(t,z,y,x),其各自的索引由[l,k,j,I]表示。对于每个(t,y,x),我想找到k
的最小值,这样Gamma[l,k,j,I]>g_crit
,其中g_crit
是一个常数。将这组最低的k
值表示为k_low
;我发现我可以很好地用
k_low = np.argmax(Gamma > g_crit, axis=1)
还有另一个数组levs
,levs.shape=(7,)
,也对应于z维度。我最终尝试创建数组levs_low
,这样levs_low.shape=(20,90144)
和levs_low[l,j,I]=levs[k_low[l,j,I]
。我被困在这个台阶上了。有什么想法吗?谢谢。这应该可以做到:
levs_low=levs[k_low]
>>> Gamma=np.random.rand(20,7,90,144)
>>> k_low = np.argmax(Gamma > .3, axis=1)
>>> levs=np.random.rand(7)
>>> levs_low=levs[k_low]
>>> levs_low.shape
(20, 90, 144)
举个小例子:
>>> g=np.random.randint(0,5,(4,4))
>>> g
array([[2, 0, 2, 2],
[2, 0, 1, 0],
[3, 3, 0, 3],
[3, 0, 4, 4]])
>>> k=np.arange(5)*-1
>>> k
array([ 0, -1, -2, -3, -4])
>>> k[g] #Uses indices of g to select values from k. Also same as np.take(k,g)
array([[-2, 0, -2, -2],
[-2, 0, -1, 0],
[-3, -3, 0, -3],
[-3, 0, -4, -4]])
@萨洛·卡斯特罗的回答很有趣。奇怪的是,花哨的索引和np.take
之间的时间相差约5倍
%timeit levs[k_low]
100 loops, best of 3: 2.3 ms per loop
%timeit np.take( levs, k_low )
1000 loops, best of 3: 439 us per loop
In [33]: np.all(levs[k_low]==np.take(levs,k_low))
Out[33]: True
对于您的情况,似乎np.take()
是一个不错的选择:
levs_low = np.take( levs, k_low )
OBS:take
似乎提供了优化的性能,非常优雅!我早该知道Python会让事情变得这么简单。谢谢