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

2024-05-16 00:23:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有mxn阶的矩阵a和mx1的向量。我想用向量的元素作为每一行的偏移量,从矩阵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 xrange(y):
    A[i,y[i]] = #perform operations here

不使用任何显式循环。

预期产量是

[3,2,5,1,1]

我正在使用Python和numpy库。

谢谢你的帮助!


Tags: 方法innumpy元素forhere矩阵向量
2条回答

首先应该将listA转换为NumPy数组:

>>> import numpy as np
>>> 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]])
...
>>> y = [4, 2, 1, 3, 2]

在那之后,没有什么能阻止你使用advanced indexing

>>> A[np.arange(A.shape[0]), y]
array([3, 2, 5, 1, 1])
>>> A[np.arange(A.shape[0]), y] = -99
>>> A
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]])

下面的代码遵循传统的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]

相关问题 更多 >