2016-10-24 171 views
1

我试图从一个3d numpy数组中提取值。此刻,我可以执行以下操作:用二维数组对三维numpy数组进行索引

newmesh.shape 
(40,40,40) 

newmesh[2,5,6] 
6 

但是,如果我尝试使用数组索引它,并不如预期的结果;

newmesh[np.array([2,5,6])].shape 
(3, 42, 42) 

我试过使用np.take,但它产生以下;

np.take(newmesh,np.array([2,5,6])) 
[-1 -1 -1] 

任何想法为什么会发生这种情况?我的目标是输入一个(n,3)数组,其中每行对应于newmesh的值,即输入一个(n,3)数组将返回一个长度为n的1d数组。

回答

1

随着idx(n,3)索引阵列,使用linear-indexing一个办法是用np.ravel_multi_index -

np.take(newmesh,np.ravel_multi_index(idx.T,newmesh.shape)) 

与元组形成的一种方法是这样的 -

newmesh[tuple(idx.T)] 

如果只有三种尺寸,您甚至可以使用柱状切片将索引编入每个维度,例如 -

newmesh[idx[:,0],idx[:,1],idx[:,2]] 

运行测试如果任何人的兴趣在看到与列出的方法相关的性能数字,这里有一个快速运行测试 -

In [18]: newmesh = np.random.rand(40,40,40) 

In [19]: idx = np.random.randint(0,40,(1000,3)) 

In [20]: %timeit np.take(newmesh,np.ravel_multi_index(idx.T,newmesh.shape)) 
10000 loops, best of 3: 22.5 µs per loop 

In [21]: %timeit newmesh[tuple(idx.T)] 
10000 loops, best of 3: 20.9 µs per loop 

In [22]: %timeit newmesh[idx[:,0],idx[:,1],idx[:,2]] 
100000 loops, best of 3: 17.2 µs per loop 
+0

由于这是非常有益的。你明白我为什么做错了吗? – Jack

+0

@Jack没有任何逗号,在NumPy数组中,你只能用'newmesh [np.array([2,5,6])]'索引到第一个dim,它会从第一个dim选择三个elem,一切从昏暗的其余部分。所以,它本质上是:'newmesh [np.array([2,5,6]),:,:]'。 – Divakar