使用3分量索引列表从3D numpy数组中获取值列表(4D数组)

bsxbgnwa  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(118)

我已经看过许多不同的索引2D和3D数组的答案,我不能找到一个简单的解决方案。我有一个3D数组,并有一个3分量索引列表(ix,iy,iz)。我想从数组中的值列表,其中每个值是使用3个组成部分的索引之一选择。
我已经能够通过使用reshape()np.apply_along轴来扁平化数组来解决这个问题,但这似乎并不优雅,特别是因为我需要定义一个函数来将3分量索引转换为1分量索引。

import numpy as np
data = np.arange(125).reshape(5,5,5)
indices = np.array(((0, 0, 0), (4, 4, 4), (0, 0, 4)), dtype=int)

# For-loop implementation
values = []
for i in indices:
    values.append(data[i[0], i[1], i[2]])
print(values)

# My inelegant numpy implementation
def three_to_one(index3d,dim):
    return index3d[0]*dim[1]*dim[2] + index3d[1]*dim[2] + index3d[2]

indices_1d = np.apply_along_axis(three_to_one, 1, indices, data.shape)
data_flat = data.reshape(-1)
values = data_flat[indices_1d]
print(values)
gtlvzcf8

gtlvzcf81#

您可以通过转置索引和using tuple()来将索引的每一列解释为数据的索引。

>>> data[tuple(indices.T)]
array([  0, 124,   4])
dw1jzc5e

dw1jzc5e2#

从Python-3.11开始,它可以工作:

data[*indices.T]

在python的旧版本中,这是等价的:

data[tuple(indices.T)]

诀窍在于,你可以给每个维度给予一个序列,逗号分隔或作为元组(而不是列表!)。在np.nonzero中可以看到这一点

data = np.random.random((4, 5, 6))
above = data[np.nonzero(a > 0.75)]

相关问题