繁体   English   中英

用2d数组索引3d numpy数组

[英]Indexing of 3d numpy arrays with 2d arrays

我正在尝试从3d 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数组。

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM