我有一个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)
答案 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)
0
中cols2[:, [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.array
和numpy.matrix
之间的根本区别。几乎在所有情况下,numpy.array
就足够了。