在核阵列中相乘

2024-04-25 03:59:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用2D数组中的每一个项乘以1D数组中的相应项。如果我想用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]

有人知道有没有一种优雅的方式来处理努比吗? 谢谢, 亚历克斯


Tags: 函数numpy方式数组multiply
3条回答

我比较了不同的速度选项,发现所有选项(除了diag)的速度都一样快,这让我大吃一惊。我个人使用

A * b[:, None]

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

enter image description here


复制绘图的代码:

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)",
)

也可以使用矩阵乘法(又名点乘):

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

numpy.dot(c,a)

更优雅的可能是品味的问题。

像你所说的正常乘法:

>>> 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]])

相关问题 更多 >