我有一个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]指定您要从2D数组中切出长度为97的1D向量。 cols2[:, [0]]指定要从2D数组中切出形状为(97, 1)的2D子数组。方括号[]在这里有很大的不同。

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]-列子切片。

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


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

10-06 16:07