为什么这两个Numpy Slice命令的输出类型会有所不同

问题描述

下面两个命令的输出给出了不同的数组形状,我非常感谢解释原因并向我推荐参考资料(如果有),我在互联网上搜索了一下,但没有找到任何明确的解释。

data.shape
(11,2)

# outputs the values in column-0 in an (1x11) array.
data[:,0] 

array([-7.24070e-01, -2.40724e+00,  2.64837e+00,  3.60920e-01,
        6.73120e-01, -4.54600e-01,  2.20168e+00,  1.15605e+00,
        5.06940e-01, -8.59520e-01, -5.99700e-01])


# outputs the values in column-0 in an (11x1) array
data[:,:-1] 


array([[-7.24070e-01],
       [-2.40724e+00],
       [ 2.64837e+00],
       [ 3.60920e-01],
       [ 6.73120e-01],
       [-4.54600e-01],
       [ 2.20168e+00],
       [ 1.15605e+00],
       [ 5.06940e-01],
       [-8.59520e-01],
       [-5.99700e-01]])


解决方案

我会尝试将评论合并为答案。

首先了解一下Python列表索引

In [92]: alist = [1,2,3]

选择项目:

In [93]: alist[0]
Out[93]: 1

复制整个列表:

In [94]: alist[:]
Out[94]: [1, 2, 3]

或长度为2、1或0的切片:

In [95]: alist[:2]
Out[95]: [1, 2]
In [96]: alist[:1]
Out[96]: [1]
In [97]: alist[:0]
Out[97]: []

数组遵循相同的基本规则

In [98]: x = np.arange(12).reshape(3,4)
In [99]: x
Out[99]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

选择一行:

In [100]: x[0]
Out[100]: array([0, 1, 2, 3])

或列:

In [101]: x[:,0]
Out[101]: array([0, 4, 8])

x[0,1]选择单个元素。

https://numpy.org/doc/stable/user/basics.indexing.html#single-element-indexing

使用切片编制索引将返回多行:

In [103]: x[0:2]
Out[103]: 
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
In [104]: x[0:1]            # it retains the dimensions, even if only 1 (or even 0)
Out[104]: array([[0, 1, 2, 3]])

列也是如此:

In [106]: x[:,0:1]
Out[106]: 
array([[0],
       [4],
       [8]])

两个维度的子切片:

In [107]: x[0:2,1:3]
Out[107]: 
array([[1, 2],
       [5, 6]])

https://numpy.org/doc/stable/user/basics.indexing.html

x[[0]]也返回二维数组,但这会进入";Advanced";索引(它没有等效列表)。

相关文章