我尝试将二维数组中的每个项与一维数组中的相应项相乘。如果我想将每一列乘以一维数组,这是非常简单的,如numpy.multiply函数所示。但我想做相反的事情,将每一项相乘。换句话说,我想做乘法:
[1,2,3] [0]
[4,5,6] * [1]
[7,8,9] [2]
并获取
[0,0,0]
[4,5,6]
[14,16,18]
但我却得到了
[0,2,6]
[0,5,12]
[0,8,18]
有没有人知道用numpy做这件事有一个优雅的方法?谢谢你,亚历克斯
发布于 2013-08-30 07:00:10
正常乘法,如您所示:
>>> import numpy as np
>>> m = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> c = np.array([0,1,2])
>>> m * c
array([[ 0, 2, 6],
[ 0, 5, 12],
[ 0, 8, 18]])
如果添加一个轴,它将按您所需的方式进行倍增:
>>> m * c[:, np.newaxis]
array([[ 0, 0, 0],
[ 4, 5, 6],
[14, 16, 18]])
您还可以转置两次:
>>> (m.T * c).T
array([[ 0, 0, 0],
[ 4, 5, 6],
[14, 16, 18]])
发布于 2017-08-26 20:28:49
我比较了不同选项的速度,发现--令我惊讶的是--所有选项(除了diag
)都是同样快的。我个人使用
A * b[:, None]
(或(A.T * b).T
),因为它很短。
重现该图的代码:
import numpy
import perfplot
def newaxis(data):
A, b = data
return A * b[:, numpy.newaxis]
def none(data):
A, b = data
return A * b[:, None]
def double_transpose(data):
A, b = data
return (A.T * b).T
def double_transpose_contiguous(data):
A, b = data
return numpy.ascontiguousarray((A.T * b).T)
def diag_dot(data):
A, b = data
return numpy.dot(numpy.diag(b), A)
def einsum(data):
A, b = data
return numpy.einsum("ij,i->ij", A, b)
perfplot.save(
"p.png",
setup=lambda n: (numpy.random.rand(n, n), numpy.random.rand(n)),
kernels=[
newaxis,
none,
double_transpose,
double_transpose_contiguous,
diag_dot,
einsum,
],
n_range=[2 ** k for k in range(13)],
xlabel="len(A), len(b)",
)
发布于 2013-08-30 07:50:44
您还可以使用矩阵乘法(也称为点积):
a = [[1,2,3],[4,5,6],[7,8,9]]
b = [0,1,2]
c = numpy.diag(b)
numpy.dot(c,a)
哪一个更优雅可能是一个品味问题。
https://stackoverflow.com/questions/18522216
复制相似问题