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

时间:2015-10-19 16:03:40

标签: python arrays numpy matrix-multiplication

我们说我有一个这样的矩阵:

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]])

有人能提出比这更智能的解决方案吗?

4 个答案:

答案 0 :(得分:4)

您可以使用另一个NumPy数组直接索引NumPy数组。在您的情况下,您有要忽略的行的索引,因此您可以从此构建 include 的索引数组:

MAX_ORDER
编辑:作为@DSM注释,对于大型数组,使用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]]) 代替上面使用的列表推导。

答案 1 :(得分:4)

看起来你可以只进行乘法,然后将原始数据放回你想要忽略的位置......

>>> 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]])

答案 2 :(得分:1)

您可以使用boolean indexingnp.in1d来选择在供稿索引列表中排除的行。实现看起来像这样 -

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

答案 3 :(得分:-1)

a

中的第一行
<item name="switchStyle">@style/MySwitchCompat</item>

<style name="MySwitchCompat" parent="Widget.AppCompat.CompoundButton.Switch">
    <item name="android:textColor">@color/accent</item>
    <item name="android:fontFamily">sans-serif-light</item>
</style>

..等等其他行。