首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在numpy数组中乘以

在numpy数组中乘以
EN

Stack Overflow用户
提问于 2013-08-30 06:53:01
回答 6查看 124.6K关注 0票数 106

我尝试将二维数组中的每个项与一维数组中的相应项相乘。如果我想将每一列乘以一维数组,这是非常简单的,如numpy.multiply函数所示。但我想做相反的事情,将每一项相乘。换句话说,我想做乘法:

代码语言:javascript
复制
[1,2,3]   [0]
[4,5,6] * [1]
[7,8,9]   [2]

并获取

代码语言:javascript
复制
[0,0,0]
[4,5,6]
[14,16,18]

但我却得到了

代码语言:javascript
复制
[0,2,6]
[0,5,12]
[0,8,18]

有没有人知道用numpy做这件事有一个优雅的方法?谢谢你,亚历克斯

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-08-30 07:00:10

正常乘法,如您所示:

代码语言:javascript
复制
>>> 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]])

如果添加一个轴,它将按您所需的方式进行倍增:

代码语言:javascript
复制
>>> m * c[:, np.newaxis]
array([[ 0,  0,  0],
       [ 4,  5,  6],
       [14, 16, 18]])

您还可以转置两次:

代码语言:javascript
复制
>>> (m.T * c).T
array([[ 0,  0,  0],
       [ 4,  5,  6],
       [14, 16, 18]])
票数 133
EN

Stack Overflow用户

发布于 2017-08-26 20:28:49

我比较了不同选项的速度,发现--令我惊讶的是--所有选项(除了diag)都是同样快的。我个人使用

代码语言:javascript
复制
A * b[:, None]

(或(A.T * b).T),因为它很短。

重现该图的代码:

代码语言:javascript
复制
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)",
)
票数 61
EN

Stack Overflow用户

发布于 2013-08-30 07:50:44

您还可以使用矩阵乘法(也称为点积):

代码语言:javascript
复制
a = [[1,2,3],[4,5,6],[7,8,9]]
b = [0,1,2]
c = numpy.diag(b)

numpy.dot(c,a)

哪一个更优雅可能是一个品味问题。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18522216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档