How to multiply a scalar throughout a specific column within a NumPy array?
you can do this in two simple steps using NumPy:>>> # multiply column 2 of the 2D array, A, by 5.2>>> A[:,1] *= 5.2>>> # assuming by 'cumulative sum' you meant the 'reduced' sum:>>> A[:,1].sum()>>> # if in fact you want the cumulative sum (ie, returns a new column)>>> # then do this for the second step instead:>>> NP.cumsum(A[:,1])
with some mocked data:
>>> A = NP.random.rand(8, 5)>>> A array([[ 0.893, 0.824, 0.438, 0.284, 0.892], [ 0.534, 0.11 , 0.409, 0.555, 0.96 ], [ 0.671, 0.817, 0.636, 0.522, 0.867], [ 0.752, 0.688, 0.142, 0.793, 0.716], [ 0.276, 0.818, 0.904, 0.767, 0.443], [ 0.57 , 0.159, 0.144, 0.439, 0.747], [ 0.705, 0.793, 0.575, 0.507, 0.956], [ 0.322, 0.713, 0.963, 0.037, 0.509]])>>> A[:,1] *= 5.2>>> A array([[ 0.893, 4.287, 0.438, 0.284, 0.892], [ 0.534, 0.571, 0.409, 0.555, 0.96 ], [ 0.671, 4.25 , 0.636, 0.522, 0.867], [ 0.752, 3.576, 0.142, 0.793, 0.716], [ 0.276, 4.255, 0.904, 0.767, 0.443], [ 0.57 , 0.827, 0.144, 0.439, 0.747], [ 0.705, 4.122, 0.575, 0.507, 0.956], [ 0.322, 3.71 , 0.963, 0.037, 0.509]])>>> A[:,1].sum() 25.596156138451427
just a few simple rules are required to grok element selection (indexing) in NumPy:
NumPy, like Python, is 0-based, so eg, the "1" below refers to the second column
commas separate the dimensions inside the brackets, so [rows, columns], eg, A[2,3] means the item ("cell") at row three, column four
a colon means all of the elements along that dimension, eg, A[:,1] creates a view of A's column 2; A[3,:] refers to the fourth row
Sure:
import numpy as np# Let a be some 2d array; here we just use dummy data # to illustrate the methoda = np.ones((10,5))# Multiply just the 2nd column by 5.2 in-placea[:,1] *= 5.2# Now get the cumulative sum of just that columncsum = np.cumsum(a[:,1])
If you don't want to do this in-place you would need a slightly different strategy:
b = 5.2*a[:,1]csum = np.cumsum(b)
To multiply a constant with a specific column or row:
import numpy as np;X=np.ones(shape=(10,10),dtype=np.float64);X;### this is our default matrixarray([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]) ## now say we want to multiple it with 10 X=X*10;array([[10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.], [10., 10., 10., 10., 10., 10., 10., 10., 10., 10.]])### Now if, we want to mulitply 3,5, 7 column with 5X[:,[3,5,7]]=X[:,[3,5,7]]*5 array([[10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.], [10., 10., 10., 50., 10., 50., 10., 50., 10., 10.]])
Similarly, we can do it for any columns.Hope it clarifies.