通过索引检索二维数组元素的 Pythonic 方法
Pythonic way of retrieving elements of 2D array by indices
假设我有这个数据数组
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])
是否有更 pythonic 或更 numpy-ish 的变体,我可以通过花式数组索引或其他方式在一行中完成此操作?
我试过了(受启发):
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']]
你很接近,但是当你想用这样对齐的索引索引到 numpy.ndarray
时,不要使用 [][]
。使用元组做多维索引:
>>> 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')
假设我有这个数据数组
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])
是否有更 pythonic 或更 numpy-ish 的变体,我可以通过花式数组索引或其他方式在一行中完成此操作?
我试过了(受
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']]
你很接近,但是当你想用这样对齐的索引索引到 numpy.ndarray
时,不要使用 [][]
。使用元组做多维索引:
>>> 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')