索引到2或3维的矢量场

时间:2016-09-28 10:05:48

标签: python numpy

我有一个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得到线性化"然后用作索引,因此它不起作用。 如何实现我的目标?

2 个答案:

答案 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元素列表/数组。