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

时间:2018-02-19 01:10:13

标签: python arrays numpy slice sub-array

我有一个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)

2 个答案:

答案 0 :(得分:3)

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上的注释。

答案 1 :(得分:0)

0cols2[:, [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 整数来表示其形状。因此,1D数组仅由单个整数表示。没有一维数组的“行”或“列”的概念。

您应该反对将numpy数组视为包含的冲动,而是将它们视为具有形状。这是numpy.arraynumpy.matrix之间的根本区别。几乎在所有情况下,numpy.array就足够了。