从numpy数组获取索引并应用于第二个较低维数组以创建新数组

时间:2013-07-31 22:25:28

标签: python numpy multidimensional-array

我有一个数组GammaGamma.shape=(20,7,90,144),代表维度(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)

还有另一个数组levslevs.shape=(7,),也与z维度相对应。我最终尝试创建数组levs_low,例如levs_low.shape=(20,90,144)levs_low[l,j,i]=levs[k_low[l,j,i]]。我坚持这一步。有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:4)

对于您的情况,似乎np.take()是一个不错的选择:

levs_low = np.take( levs, k_low )

OBS:take似乎提供了优化的效果check this question

答案 1 :(得分:3)

这应该可以解决问题:

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]])
@Saullo Castro的回答很有意思。奇怪的是,花式索引和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