忽略矩阵中某些行的逐元素乘法

2024-10-03 06:29:30 发布

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

假设我有这样一个矩阵:

import numpy as np

a = np.array([[1, 2, 3], [89, 43, 2], [12, -3, 4], [-2, 4, 7]])

array([[ 1,  2,  3],
       [89, 43,  2],
       [12, -3,  4],
       [-2,  4,  7]])

一个向量是这样的:

b = np.array([1, 2, 3])

如果我现在想做元素乘法,我可以简单地做

c = a * b

并获得

array([[ 1,  4,  9],
       [89, 86,  6],
       [12, -6, 12],
       [-2,  8, 21]])

我的问题是:怎样才能只对矩阵中的某些行进行这种乘法?我现在是这样做的:

E = a.copy()

# ignore these rows
ignInd = [1, 3]

for ind in xrange(a.shape[0]):
    if ind not in ignInd:
        E[ind, :] = a[ind, :] * b

矩阵E看起来与所需的一样(第1行和第3行与a中的相同):

array([[ 1,  4,  9],
       [89, 43,  2],
       [12, -6, 12],
       [-2,  4,  7]])

有人能想出比这更聪明的解决办法吗?你知道吗


Tags: inimportnumpy元素asnp矩阵array
3条回答

看起来你可以做乘法,然后把原始数据放回你想忽略的地方。。。你知道吗

>>> import numpy as np
>>> a = np.array([[1,2,3],[89,43,2],[12, -3, 4], [-2, 4, 7]])
>>> b = np.array([1,2,3])
>>> c = a * b
>>> ignInd = [1,3]
>>> c[ignInd, :]
array([[89, 86,  6],
       [-2,  8, 21]])
>>> c[ignInd, :] = a[ignInd, :]
>>> c
array([[ 1,  4,  9],
       [89, 43,  2],
       [12, -6, 12],
       [-2,  4,  7]])

您可以直接用另一个NumPy数组索引一个NumPy数组。在您的例子中,您有要忽略的行的索引,因此您可以构建一个索引数组,以便包含

In [21]: ignInd = [1,3]   #ignore these rows
In [22]: ind = np.array([i for i in range(a.shape[0]) if i not in ignInd])
In [23]: E2 = a.copy()

In [24]: E2[ind,:] = a[ind,:]*b

In [25]: E2
Out[25]: 
array([[ 1,  4,  9],
       [89, 43,  2],
       [12, -6, 12],
       [-2,  4,  7]])

EDIT:正如@DSM注释所示,对于大型数组,使用NumPy的矢量化方法构建索引数组会更有效,即。ind = np.setdiff1d(np.arange(len(a)), ignInd)而不是上面使用的列表。你知道吗

可以使用^{}^{}来选择在给定索引列表中排除的行。这个实现看起来像这样-

E = a.copy()
mask = ~np.in1d(np.arange(a.shape[0]),ignInd,)
E[mask] = a[mask]*b

相关问题 更多 >