如何正确添加两个numpy数组?

时间:2019-09-24 11:05:52

标签: python

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

我很困惑np.array([10,10])和np.array([[10,10]])之间的区别。在学校里,我了解到只能添加尺寸相同的矩阵。当我在np.array([10,10])上使用shape方法时,它给了我(2,)...这是什么意思?如何添加np_mat和np.array([10,10])?尺寸在我看来不一样。我不明白什么?

2 个答案:

答案 0 :(得分:1)

您不能添加两个大小不同的数组。 但是这两个都具有等于1的第一维长度。(即len(a) == len(b)

形状(2,)表示数组是一维的,而第一维的大小是2。

np.array([[1, 2], [3, 4], [5, 6]])的形状为(3, 2),表示二维(3x2)。

但是您可以添加它们,因为它们的维数不同,并且numpy将数字强制为一个充满该相同数字的任意数组。这在numpy中称为broadcasting

即您的代码获得与以下结果相同的结果:

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

或:

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

答案 1 :(得分:1)

看起来numpy在这里改变了数学规则。实际上,它将第二个矩阵x1 <- c(2.525729, 2.674149, 2.079442, 2.197225, 2.970414, 2.079442, 2.197225, 1.945910, 1.945910, 2.197225, 1.871802, 2.351375,2.302585, 1.504077, 1.945910, 2.140066, 1.871802, 2.079442, 1.252763, 2.079442, 2.862201, 2.351375, 2.484907, 1.791759,2.564949) x2 <- c(0.2701716, 0.2461830, 0.2397317, 0.3015113, 0.2058467, 0.2752409, 0.1765011, 0.2851330, 0.2911113, 0.2024441, 0.2344036, 0.2132007, 0.1754116, 0.2312486, 0.2515773, 0.2531848, 0.2886751, 0.2795085, 0.1957401, 0.2626129, 0.1537552, 0.2390457, 0.2141765, 0.3100868, 0.1976424) library(car) dataEllipse(x1,x2,levels=c(0.95,0.95)) 与第一个[10, 10]的每个元素相加。

这称为https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html。 [[1, 2], [3, 4], [5, 6]]的形状为[10, 10](在数学上为(2, )),2的形状为[[1, 2], [3, 4], [5, 6]](即在数学上为{{1} }。因此,从一般广播规则中,您应该得到形状为(3, 2)(即,数学上为3 x 2)的结果。

  

我很困惑np.array([10,10]]和np.array([[10,10]])之间的区别。

第一个是数组。第二个是数组数组(在内存中,实际上是一个单独的数组,但这与此处无关)。您可以将第一个视为列向量(大小为(3, 2)的矩阵),第二个为线向量(大小为3 x 2的矩阵)。但是,请注意,在开始将向量解释为矩阵之前,线向量和列向量之间的区别在数学上是无关紧要的。