首页 > 解决方案 > 通过索引检索二维数组元素的Pythonic方法

问题描述

假设我有这个数据数组

data = np.asarray([[1, 2, 3, 4], ['a', 'b', 'c', 'd'], ['A', 'B', 'C', 'D'], ['x', 'y', 'z', 'zz']])

以及这些索引,每个“对”对应于数据矩阵中的一个单元格

indices = np.asarray([[0, 0], [3, 0], [2, 2], [3, 2]])

现在我想从指定的单元格中检索数据。我可以通过以下方式做到这一点:

searched_data = []
for x, y in coords:
    searched_data.append(data[y][x])

是否有更 Python 或更多 numpy 的变体,我可以通过花哨的数组索引或其他东西在一行中做到这一点?

我试过(受这篇文章的启发):

x_indexed1 = data[indices[:, 1]][:,[indices[:, 0]]]

但这给了我

[[['1' '4' '3' '4']]

 [['1' '4' '3' '4']]

 [['A' 'D' 'C' 'D']]

 [['A' 'D' 'C' 'D']]]

和这个

x_indexed = data[np.ix_(indices[:, 1],indices[:, 0])]

这使

[['1' '4' '3' '4']
 ['1' '4' '3' '4']
 ['A' 'D' 'C' 'D']
 ['A' 'D' 'C' 'D']]

标签: pythonarraysnumpynumpy-ndarraynumpy-slicing

解决方案


你很接近,但是当你想用这样的numpy.ndarray对齐索引索引到 a 时,不要使用[][]. 使用元组进行多维索引:

>>> data[indices[:, 1], indices[:,0]]
array(['1', '4', 'C', 'D'], dtype='<U21')

为了更清楚:

>>> ys = indices[:, 1]
>>> xs = indices[:, 0]
>>> data[ys, xs]
array(['1', '4', 'C', 'D'], dtype='<U21')

您的第一次尝试是这样的:

>>> data[ys][:,[xs]]
array([[['1', '4', '3', '4']],

       [['1', '4', '3', '4']],

       [['A', 'D', 'C', 'D']],

       [['A', 'D', 'C', 'D']]], dtype='<U21')

因此,打破这一点,“部分索引”假设:您遗漏的维度中有一个完整的切片,因此对于您data[ys, :]选择这些行:

>>> data[ys]
array([['1', '2', '3', '4'],
       ['1', '2', '3', '4'],
       ['A', 'B', 'C', 'D'],
       ['A', 'B', 'C', 'D']], dtype='<U21')

就是您使用 索引的内容[:, [xs]],它基本上选择了所有行和那些 xs 的列,您将它们包装在一个列表中,这基本上取消了一个维度:

>>> data[ys][...,[xs]]
array([[['1', '4', '3', '4']],

       [['1', '4', '3', '4']],

       [['A', 'D', 'C', 'D']],

       [['A', 'D', 'C', 'D']]], dtype='<U21')

推荐阅读