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(14)],
logx=True,
logy=True,
xlabel="len(A), len(b)",
)
我比较了不同的速度选项,发现所有选项(除了
diag
)的速度都一样快,这让我大吃一惊。我个人使用(或者
(A.T * b).T
)因为它很短。复制绘图的代码:
也可以使用矩阵乘法(又名点乘):
更优雅的可能是品味的问题。
像你所说的正常乘法:
如果您添加一个轴,它将按您所需的方式倍增:
你也可以转置两次:
相关问题 更多 >
编程相关推荐