2个形状为-的数组有什么区别?
(442,1)和(442,)吗?
打印这两个将产生相同的输出,但是当我检查是否相等 == 时,我得到了一个像这样的2D向量-
array([[ True, False, False, ..., False, False, False],
[False, True, False, ..., False, False, False],
[False, False, True, ..., False, False, False],
...,
[False, False, False, ..., True, False, False],
[False, False, False, ..., False, True, False],
[False, False, False, ..., False, False, True]], dtype=bool)
有人可以解释差异吗?
最佳答案
形状(442, 1)
的数组是二维的。它具有442行和1列。
形状(442, )
的数组是一维的,由442个元素组成。
请注意,他们的代表也应该看起来有所不同。括号的数量和位置有所不同:
In [7]: np.array([1,2,3]).shape
Out[7]: (3,)
In [8]: np.array([[1],[2],[3]]).shape
Out[8]: (3, 1)
请注意,您可以使用
np.squeeze
删除长度为1的轴:In [13]: np.squeeze(np.array([[1],[2],[3]])).shape
Out[13]: (3,)
NumPy broadcasting rules允许在需要时在左侧自动添加新轴。因此
(442,)
可以广播到(1, 442)
。长度为1的轴可以广播到任意长度。所以当您测试
(442, 1)
形状的数组与(442, )
形状的数组之间的相等性时,第二个数组将升级为(1, 442)
形状,然后这两个数组将扩展其长度为1的轴,以便它们都成为(442, 442)
形状的广播数组。这就是为什么当您测试相等性时,结果是一个形状为(442, 442)
的 bool 数组。In [15]: np.array([1,2,3]) == np.array([[1],[2],[3]])
Out[15]:
array([[ True, False, False],
[False, True, False],
[False, False, True]], dtype=bool)
In [16]: np.array([1,2,3]) == np.squeeze(np.array([[1],[2],[3]]))
Out[16]: array([ True, True, True], dtype=bool)