在一个numpy数组中相乘

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (194)

我试图将二维数组中的每个项乘以一维数组中的相应项。如果我想将每列乘以1D数组,这很容易,如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?非常感谢,Alex

提问于
用户回答回答于

你也可以使用矩阵乘法(aka dot product):

a = [[1,2,3],[4,5,6],[7,8,9]]
b = [0,1,2]
c = numpy.diag(b)

numpy.dot(c,a)
用户回答回答于

我比较了不同的速度选项,发现 - 令我惊讶的是 - 所有选项(除外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(14)],
    logx=True,
    logy=True,
    xlabel="len(A), len(b)",
)

扫码关注云+社区

领取腾讯云代金券