我已经看过许多不同的索引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)
2条答案
按热度按时间gtlvzcf81#
您可以通过转置索引和using tuple()来将索引的每一列解释为数据的索引。
dw1jzc5e2#
从Python-3.11开始,它可以工作:
在python的旧版本中,这是等价的:
诀窍在于,你可以给每个维度给予一个序列,逗号分隔或作为元组(而不是列表!)。在
np.nonzero
中可以看到这一点