不同形状的NumPy数组的元素级乘法

djp7away  于 2023-10-19  发布在  其他
关注(0)|答案(5)|浏览(121)

当我使用numpy.multiply(a,b)将numpy数组与形状(2, 1),(2,)相乘时,我得到了一个2 × 2的矩阵。但我想要的是元素乘法。
我不太了解numpy的规则。有人能解释一下这里发生了什么吗?

fhg3lkii

fhg3lkii1#

当在两个数组之间进行元素操作时,这两个数组的维度不同,NumPy将执行广播。在你的例子中,Numpy将沿着a的行广播b

import numpy as np
a = np.array([[1],
              [2]])
b = [3, 4]
print(a * b)

提供:

[[3 4]
 [6 8]]

为了防止这种情况,需要使ab具有相同的维数。你可以通过在索引中使用np.newaxisNone向数组添加维度,如下所示:

print(a * b[:, np.newaxis])

提供:

[[3]
 [8]]
p1iqtdky

p1iqtdky2#

假设你有两个数组ab,形状分别为(2,3)(2,)

a = np.random.randint(10, size=(2,3))
b = np.random.randint(10, size=(2,))

例如,这两个数组包含:

a = np.array([[8, 0, 3],
              [2, 6, 7]])
b = np.array([7, 5])

现在,为了将product元素处理为元素a*b,您必须指定numpy在到达数组b的缺失axis=1时必须做什么。你可以通过添加None来实现:

result = a*b[:,None]

其中result为:

array([[56,  0, 21],
       [10, 30, 35]])
yjghlzjz

yjghlzjz3#

下面是输入数组ab,它们的形状和你提到的一样:

In [136]: a
Out[136]: 
array([[0],
       [1]])

In [137]: b
Out[137]: array([0, 1])

现在,当我们使用*numpy.multiply(a, b)进行乘法时,我们得到:

In [138]: a * b
Out[138]: 
array([[0, 0],
       [0, 1]])

结果是一个(2,2)数组,因为numpy使用广播。

# b
    #a | 0     1
     ------------
     0 | 0*0   0*1
     1 | 1*0   1*1
0ejtzxu1

0ejtzxu14#

我刚刚在numpy中解释了广播数组中的广播规则
就您而言

(2,1) + (2,) => (2,1) + (1,2) => (2,2)

它必须为第二个参数添加一个维度,并且只能在开头添加(以避免歧义)。
所以你想要一个(2,1)结果,你必须自己扩展第二个参数,使用reshape[:, np.newaxis]

mlnl4t2r

mlnl4t2r5#

如果a和B是Python列表。下面的代码可以工作。

import numpy as np
def multiply_elementwise_arrays(a, b):
        a = np.array(a)
        b = np.array(b)        
        if a.size == b.size:
            return a*b
        elif a.size < b.size:
            a = np.array(a[:,None])
            return b*a
        else:
            b = np.array(b[:,None])
            return a*b

相关问题