当我使用numpy.multiply(a,b)将numpy数组与形状(2, 1),(2,)相乘时,我得到了一个2 × 2的矩阵。但我想要的是元素乘法。我不太了解numpy的规则。有人能解释一下这里发生了什么吗?
numpy.multiply(a,b)
(2, 1),(2,)
fhg3lkii1#
当在两个数组之间进行元素操作时,这两个数组的维度不同,NumPy将执行广播。在你的例子中,Numpy将沿着a的行广播b:
a
b
import numpy as np a = np.array([[1], [2]]) b = [3, 4] print(a * b)
提供:
[[3 4] [6 8]]
为了防止这种情况,需要使a和b具有相同的维数。你可以通过在索引中使用np.newaxis或None向数组添加维度,如下所示:
np.newaxis
None
print(a * b[:, np.newaxis])
[[3] [8]]
p1iqtdky2#
假设你有两个数组a和b,形状分别为(2,3)和(2,):
(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来实现:
a*b
axis=1
result = a*b[:,None]
其中result为:
result
array([[56, 0, 21], [10, 30, 35]])
yjghlzjz3#
下面是输入数组a和b,它们的形状和你提到的一样:
In [136]: a Out[136]: array([[0], [1]]) In [137]: b Out[137]: array([0, 1])
现在,当我们使用*或numpy.multiply(a, b)进行乘法时,我们得到:
*
numpy.multiply(a, b)
In [138]: a * b Out[138]: array([[0, 0], [0, 1]])
结果是一个(2,2)数组,因为numpy使用广播。
(2,2)
# b #a | 0 1 ------------ 0 | 0*0 0*1 1 | 1*0 1*1
0ejtzxu14#
我刚刚在numpy中解释了广播数组中的广播规则就您而言
(2,1) + (2,) => (2,1) + (1,2) => (2,2)
它必须为第二个参数添加一个维度,并且只能在开头添加(以避免歧义)。所以你想要一个(2,1)结果,你必须自己扩展第二个参数,使用reshape或[:, np.newaxis]。
reshape
[:, np.newaxis]
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
5条答案
按热度按时间fhg3lkii1#
当在两个数组之间进行元素操作时,这两个数组的维度不同,NumPy将执行广播。在你的例子中,Numpy将沿着
a
的行广播b
:提供:
为了防止这种情况,需要使
a
和b
具有相同的维数。你可以通过在索引中使用np.newaxis
或None
向数组添加维度,如下所示:提供:
p1iqtdky2#
假设你有两个数组
a
和b
,形状分别为(2,3)
和(2,)
:例如,这两个数组包含:
现在,为了将product元素处理为元素
a*b
,您必须指定numpy在到达数组b
的缺失axis=1
时必须做什么。你可以通过添加None
来实现:其中
result
为:yjghlzjz3#
下面是输入数组
a
和b
,它们的形状和你提到的一样:现在,当我们使用
*
或numpy.multiply(a, b)
进行乘法时,我们得到:结果是一个
(2,2)
数组,因为numpy使用广播。0ejtzxu14#
我刚刚在numpy中解释了广播数组中的广播规则
就您而言
它必须为第二个参数添加一个维度,并且只能在开头添加(以避免歧义)。
所以你想要一个(2,1)结果,你必须自己扩展第二个参数,使用
reshape
或[:, np.newaxis]
。mlnl4t2r5#
如果a和B是Python列表。下面的代码可以工作。