假设我有这样一个矩阵:
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]])
有人能想出比这更聪明的解决办法吗?你知道吗
看起来你可以做乘法,然后把原始数据放回你想忽略的地方。。。你知道吗
您可以直接用另一个NumPy数组索引一个NumPy数组。在您的例子中,您有要忽略的行的索引,因此您可以构建一个索引数组,以便包含:
EDIT:正如@DSM注释所示,对于大型数组,使用NumPy的矢量化方法构建索引数组会更有效,即。
ind = np.setdiff1d(np.arange(len(a)), ignInd)
而不是上面使用的列表。你知道吗可以使用^{} 和^{} 来选择在给定索引列表中排除的行。这个实现看起来像这样-
相关问题 更多 >
编程相关推荐