我有一个vecfield
ndarray
m
个(w, h)
条目,用于(离散)2维或3维空间中的每个空间位置,其形状为(w, h, d)
或{{1 }}。现在我得到一个ndarray
,其中包含一系列索引(i, j)
或(i, j, k)
,我想阅读与每个索引相对应的m
条目。
代码(对于2D)可能更有用:
vecfield = np.zeros([w, h, m])
fill_me_with_data(vecfield)
idx = generate_indices()
# idx is now for example ndarray with [[0, 0], [9, 8], [15, 6], [9, 1]]
result = vecfield[idx, :]
# result should now be 4 x m (4 because 'idx' has 4 indices)
似乎idx得到线性化"然后用作索引,因此它不起作用。 如何实现我的目标?
答案 0 :(得分:1)
你应该读一下numpy高级索引的工作方式http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html。我想你想要的是:
vecfield[zip(idx)]
zip(idx)
返回第一个组件的列表,后跟第二个组件的列表,这是您需要传递的高级索引。
答案 1 :(得分:0)
In [258]: vec=np.arange(24).reshape(4,3,2)
In [263]: idx=np.array([[0,0],[1,1],[3,2]])
In [264]: idx.shape
Out[264]: (3, 2)
In [265]: vec[idx,:].shape
Out[265]: (3, 2, 3, 2)
直接使用idx
进行索引会有效地将第一个维度(大小为4)替换为此(3,2)数组。换句话说,它会为vec[i,:,:]
中的所有6个值选择idx
。
Divakar建议:
In [266]: vec[idx[:,0], idx[:,1],:]
Out[266]:
array([[ 0, 1],
[ 8, 9],
[22, 23]])
这使用idx
的第一列来索引第一维,第二列使用第二维索引。
列表zip也有效,但需要*
:
In [267]: list(zip(*idx))
Out[267]: [(0, 1, 3), (0, 1, 2)]
In [268]: vec[list(zip(*idx))]
Out[268]:
array([[ 0, 1],
[ 8, 9],
[22, 23]])
与第一个答案一样,它将第一个暗点用(0,1,3)索引。如果idx
是列表而不是数组,则它可以工作。等效的数组是:
In [272]: tuple(idx.T)
Out[272]: (array([0, 1, 3]), array([0, 1, 2]))
总而言之,要选择2维中的n
项,您需要2个n
元素列表/数组。