将numpy数组的列与另一个数组相加或相乘

时间:2015-03-16 21:57:50

标签: python arrays numpy

我有一个2D numpy数组x1D numpy数组y

import numpy as np
x = np.arange(12).reshape((4, 3))
y = np.array(([1.0,2.0,3.0,4.0])

我想将列向量y.reshape((4,1))相乘/添加到x的每一列。我尝试了以下方法:

y1 = y.reshape((4,1))    
y1 * x 

产量

array([[ 0., 1., 2.], 
       [ 6., 8., 10.], 
       [ 18., 21., 24.], 
       [ 36., 40., 44.]])

这就是我想要的。我也找到了

array([[ 1., 2., 3.], 
       [ 5., 6., 7.], 
       [ 9., 10., 11.], 
       [ 13., 14., 15.]])

y1 + x
我想知道是否有更好(更有效)的方法来实现同样的目标!

2 个答案:

答案 0 :(得分:2)

您可以使用np.addnp.multiply

>>> np.add(y1,x)
array([[  1.,   2.,   3.],
       [  5.,   6.,   7.],
       [  9.,  10.,  11.],
       [ 13.,  14.,  15.]])
>>> np.multiply(y1,x)
array([[  0.,   1.,   2.],
       [  6.,   8.,  10.],
       [ 18.,  21.,  24.],
       [ 36.,  40.,  44.]])

对于就地更改,您可以使用n iadd的{​​{1}}和imul方法:

ndarray

但请注意:

  

就地操作将使用由两个操作数的数据类型决定的精度来执行计算,但是将静默地向下转换结果(如果需要),以便它可以适合回到数组中。因此,对于混合精度计算,A {op} = B可以与A = A {op} B不同。例如,假设a = 1((3,3))。然后,+ = 3j与a = a + 3j不同:当它们都执行相同的计算时,a + = 3将结果转换为适合a,而a = a + 3j将名称a重新绑定到a结果

详细了解arithmetic-and-comparison-operations

答案 1 :(得分:2)

NumPy通过广播支持此功能。您的代码使用广播,它是最有效的方式。我通常把它写成:

>>> x * y[..., np.newaxis]
array([[  0.,   1.,   2.],
       [  6.,   8.,  10.],
       [ 18.,  21.,  24.],
       [ 36.,  40.,  44.]])

要确定它是等效的:

>>> z =  y[..., np.newaxis]
>>> z.shape
(4, 1)

您还可以看到NumPy不会复制任何数据,它只会在内部更改同一内存中的迭代

>>> z.base is y
True

在这里阅读更多内容