np.array[:,0] 和 np.array[:,[0]] 有什么区别?

what's the difference between np.array[:,0] and np.array[:,[0]]?

我有一个 numpy 数组 cols2:

print(type(cols2))
print(cols2.shape)
<class 'numpy.ndarray'>
(97, 2)

我试图使用下面的第一个代码获取这个 2d numpy 数组的第一列,然后我得到了一个向量而不是我理想的一列数据。第二个代码似乎让我得到了理想的答案,但我很困惑第二个代码在零之外添加一个括号是做什么的?

print(type(cols2[:,0]))
print(cols2[:,0].shape)
<class 'numpy.ndarray'>
(97,)

print(type(cols2[:,[0]]))
print(cols2[:,[0]].shape)
<class 'numpy.ndarray'>
(97, 1)

cols2[:, 0] 指定要从二维数组中切出长度为 97 的一维向量。 cols2[:, [0]] 指定您要从二维数组中切出形状为 (97, 1) 的二维 sub-array。方括号 [] 使一切变得不同。

v = np.arange(6).reshape(-1, 2)

v[:, 0]
array([0, 2, 4])

v[:, [0]]
array([[0],
       [2],
       [4]])

根本区别在于后一个命令中的额外维度(正如您所指出的)。这是预期的行为,在 numpy.ndarray.__get/setitem__ 中实现并在 NumPy 文档中编纂。

您也可以指定 cols2[:,0:1] 达到同样的效果 - 列 sub-slice.

v[:, 0:1]
array([[0],
       [2],
       [4]])

有关更多信息,请查看 NumPy 文档中关于 Advanced Indexing 的注释。

cols2[:, [0]]0 周围的额外方括号增加了一个额外的维度。

当您打印代码的结果时,这会变得更加清晰:

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

A.shape        # (3, 2)
A[:, 0].shape  # (3,)
A[:, 0]        # array([1, 3, 5])

A[:, [0]]

# array([[1],
#        [3],
#        [5]])

一个n-D numpy数组只能用n整数来表示它的形状。因此,一维数组仅由一个整数表示。一维数组没有"rows"或"columns"的概念。

您应该克制将 numpy 数组视为具有 的冲动,而是将它们视为具有 [=24] =]尺寸和形状。这是numpy.arraynumpy.matrix的根本区别。在几乎所有情况下,numpy.array 就足够了。