Python Numpy将多列乘以标量

Python Numpy将多列乘以标量,python,numpy,Python,Numpy,这似乎是一个非常简单的问题,但我在任何地方都找不到好的答案。如何使用numpy将(就地)选择列(可能由列表选择)乘以标量 例如,将第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['f

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

例如,将第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

为此,可以按如下方式使用数组切片-

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

另一种解决方案是创建一个继承自
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]]
结果:

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

可以将以下内容与阵列切片一起使用

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

array = np.array(arr)

array[:,(0,2)]*=4

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