Matt Stokes
Matt Stokes

Reputation: 4958

Numpy multiply multiple columns by scalar

This seems like a really simple question but I can't find a good answer anywhere. How might I multiply (in place) select columns (perhaps selected by a list) by a scalar using numpy?

E.g. Multiply columns 0 and 2 by 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)])

Currently I am doing this in multiple steps but I feel like there must be a better way especially if the list gets larger. Current way:

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

Upvotes: 1

Views: 2799

Answers (3)

Aurum
Aurum

Reputation: 35

You can use the following along with array slicing

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

Upvotes: 0

WGS
WGS

Reputation: 14169

An alternate solution is to create a class that inherits from np.ndarray and add a method to it to make the in-place mutation more intuitive.

Code:

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

Result:

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

Upvotes: 0

Anand S Kumar
Anand S Kumar

Reputation: 90889

You can use array slicing as follows for this -

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

Upvotes: 3

Related Questions