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])?尺寸在我看来不一样。我不明白什么?
答案 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
的矩阵)。但是,请注意,在开始将向量解释为矩阵之前,线向量和列向量之间的区别在数学上是无关紧要的。