如何使用索引向量从矩阵中提取元素?

11
假设我有一个大小为m×n的矩阵A和一个大小为m×1的向量。我想使用向量中每个元素在相应行中作为偏移量来提取矩阵A中的元素。
例如,
A = [[3, 0, 0, 8, 3],
     [9, 3, 2, 2, 6],
     [5, 5, 4, 2, 8],
     [3, 8, 7, 1, 2],
     [3, 9, 1, 5, 5]]

和一个向量

y = [4, 2, 1, 3, 2]
我想实现的是一种提取A中元素的方法,使得向量中的每个元素都对应于A中相应行中的一个元素,即实现:
for i in range(len(y)):
    A[i, y[i]] = #perform operations here

不使用任何显式循环。

期望的输出是,

[3, 2, 5, 1, 1]

我正在使用Python和NumPy库。


你能否也添加预期输出? - AKS
2个回答

20

您应该先将列表A转换为NumPy数组:

In [270]: import numpy as np

In [271]: A = np.array([[3, 0, 0, 8, 3],
     ...:               [9, 3, 2, 2, 6],
     ...:               [5, 5, 4, 2, 8],
     ...:               [3, 8, 7, 1, 2],
     ...:               [3, 9, 1, 5, 5]])

In [272]: cols = [4, 2, 1, 3, 2]

之后,没有任何阻止您使用高级索引

In [273]: rows = np.arange(A.shape[0])

In [274]: rows
Out[274]: array([0, 1, 2, 3, 4])

In [275]: A[rows, cols]
Out[275]: array([3, 2, 5, 1, 1])

In [276]: A[rows, cols] = -99

In [277]: A
Out[277]: 
array([[  3,   0,   0,   8, -99],
       [  9,   3, -99,   2,   6],
       [  5, -99,   4,   2,   8],
       [  3,   8,   7, -99,   2],
       [  3,   9, -99,   5,   5]])

-2
以下内容遵循传统的 Python 风格,但不针对速度进行优化。请尝试并查看它是否适用于您的用例。
A = [[1, 0, 0, 6, 1],
    [8, 2, 1, 1, 5],
    [1, 1, 0, 0, 4],
    [3, 8, 7, 1, 2],
    [3, 9, 1, 5, 5]]

b = [0, 1, 2, 3, 4]

result = [A[i][b_i] for i, b_i in enumerate(b)]
# -> [1, 2, 0, 1, 5]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接