我有下面的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序列,无},可选计算中值的一个或多个轴。默认情况下,沿阵列的扁平版本。
默认情况下,计算数组中所有值的中值。但是,您可以选择要计算的轴。