在执行数学运算时了解Python Numpy



我有下面的Numpy数组。我写了以下代码:

import numpy as np
np_mat = np.array([[1, 2],[3, 4],[5, 6]])
np_mat * 2
print(np_mat.shape)
np_mat = np_mat + np.array([[10, 11],[-1,-2]])
print(np_mat)

令人惊讶的Python抛出一个错误,称

ValueError                                Traceback (most recent call last)
<ipython-input-23-557c7da40077> in <module>
5 np_mat * 2
6 print(np_mat.shape)
----> 7 np_mat = np_mat + np.array([[10, 11],[-1,-2]])
8 print(np_mat)
9 print(np.median(np_mat))
ValueError: operands could not be broadcast together with shapes (3,2) (2,2) 

再次,当我对代码进行小的修改时,也就是说,相同的代码片段,但只是np_mat = np_mat + np.array([10, 11])运行良好,显示输出

[[11 13]
[13 15]
[15 17]]

我不明白其中的区别,Numpy加法是如何在内部工作的?有什么规则吗?我很确定Numpy加法/乘法运算不像代数中的普通矩阵运算那样工作。那有什么诀窍呢?

此外,对于像这样的Numpy 2D阵列

np_mat = np.array([[1, 2],
[3, 4],
[5, 6]]) 

当我写np.median(np_mat)时,它说结果是3.5。当数组是2D时,中值怎么可能是一个数字?当我做乘法时,我可以看到相同的结果:np_mat = np_mat * np.array([10, 11])输出是

[[10 22]
[30 44]
[50 66]]

麻木似乎令人费解!请协助。提前谢谢。

如果数组在一个轴上的大小匹配,那么元素将逐个元素进行操作,类似于内置Python函数zip((的工作方式。如果其中一个数组在一个轴上的大小为1,则该值将沿该轴广播,或者根据需要复制多次,以匹配另一个数组中沿该轴的元素数量。

请在这里阅读更多

通用广播规则

在两个数组上操作时,NumPy会比较它们的形状元素方面。它从尾部(即最右侧(尺寸开始然后向左走。时两个维度兼容

  • 它们是相等的,或者

  • 其中一个是1

当其中一个维度为1时,它将在计算中扩展为另一个数组的形状。

在第一个示例中,形状是(3,2)(2,2),因此最右边的维度可以工作,但3和2不兼容。

在第二个例子中,形状是(3,2)(1,2),因此最右边的维度有效,3与1兼容。

对于中间的例子,只需阅读正在发生的事情的文档:

轴{int,int序列,无},可选计算中值的一个或多个轴。默认情况下,沿阵列的扁平版本。

默认情况下,计算数组中所有值的中值。但是,您可以选择要计算的轴。

最新更新