我有一个2D
numpy
数组x
和1D
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
。
我想知道是否有更好(更有效)的方法来实现同样的目标!
答案 0 :(得分:2)
您可以使用np.add
和np.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结果
答案 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
在这里阅读更多内容