gpt4 book ai didi

python - 使用 2d 数组对 3d numpy 数组进行索引

转载 作者:太空宇宙 更新时间:2023-11-03 20:23:02 24 4
gpt4 key购买 nike

我正在尝试从 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 的一维数组。

最佳答案

使用idx作为(n,3)索引数组,使用线性索引的一种方法是使用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

关于python - 使用 2d 数组对 3d numpy 数组进行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58032431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com