Numpy通过标量乘以多列

时间:2015-07-14 01:37:34

标签: python numpy

这似乎是一个非常简单的问题,但我无法在任何地方找到一个好的答案。我如何使用numpy以标量的形式乘以(就地)选择列(可能由列表选择)?

E.g。将列0和2乘以4

In:  arr=([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])
Out: arr=([(4,2,12,5,6,7), (16,5,24,2,5,3), (28,8,36,2,5,9)])

目前我在多个步骤中执行此操作,但我觉得必须有更好的方法,特别是如果列表变大。目前的方式:

arr['f0'] *= 4
arr['f2'] *= 4

3 个答案:

答案 0 :(得分:3)

您可以按如下方式使用数组切片 -

In [10]: arr=([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])

In [11]: narr = np.array(arr)

In [13]: narr[:,(0,2)] = narr[:,(0,2)]*4

In [14]: narr
Out[14]:
array([[ 4,  2, 12,  5,  6,  7],
       [16,  5, 24,  2,  5,  3],
       [28,  8, 36,  2,  5,  9]])

答案 1 :(得分:0)

另一种解决方案是创建一个继承自np.ndarray的类,并为其添加一个方法,使就地变异更加直观。

<强>代码:

import numpy as np

class A(np.ndarray):

    def __new__(cls, a):
        arr = np.asarray(a)
        arr = arr.view(cls)
        return arr

    def mutate(self, col, k):
        self[:,col] *= k
        return self

a = A([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])
print a
print '---------------------'

a.mutate(0, 4)
a.mutate(2, 4)

print a

<强>结果:

[[1 2 3 5 6 7]
 [4 5 6 2 5 3]
 [7 8 9 2 5 9]]
---------------------
[[ 4  2 12  5  6  7]
 [16  5 24  2  5  3]
 [28  8 36  2  5  9]]

答案 2 :(得分:0)

您可以将以下内容与数组切片一起使用

override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    if (kind == UICollectionElementKindSectionFooter) {
        let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "CartFooterCollectionReusableView", for: indexPath)
        // Customize footerView here
        return footerView
    } else if (kind == UICollectionElementKindSectionHeader) {
        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "CartHeaderCollectionReusableView", for: indexPath)
        // Customize headerView here
        return headerView
    }
    fatalError()
}