从2D数组切片

时间:2018-12-01 19:14:54

标签: python arrays numpy numpy-ndarray

我有以下代码:

import numpy as np
a = np.array([[ 1,  2,  3,  4,  5,  6],
              [ 7,  8,  9, 10, 11, 12]])
a[:, 2:3] #get [[[3],[9]]
a[:,[2]] # get [[3],[9]]
a[:, 2, None] # get [[3],[9]]
a[:, 2] #get [3, 9]

为什么a[:, 2]得到[3,9]?

p.s。看到一些帖子谈论从2D数组中切出1列(如上面的示例)获得1D数组,但没有why的解释。

p.p.s这个问题不是关于how-to的问题,而是why的问题。

2 个答案:

答案 0 :(得分:0)

在第二个示例中,Numpy删除了单例尺寸。如果需要,您可以保留形状并获得与第一个示例等效的形状。

a[:, [2]] # get [[3],[9]]

答案 1 :(得分:-1)

我认为您使用术语1D数组的方式定义不明确。
一个选项返回一个形状为(2,1)的数组,另一个选项返回一个类似列表的形状为(2,)的数组。
它们都是两者“一维”,但是它们具有不同的numpy形状。
因此,您的目标是获得形状更像矩阵的数组,形状为(2,1),这是通过切片在所有维度上进行的,而不是选择一个特定的索引。

这是一个更直观的案例,可以通过切片或选择两个尺寸来将情况发挥到极致:

import numpy as np
a = np.array([[ 1,  2,  3,  4,  5,  6],
             [ 7,  8,  9, 10, 11, 12]])

specific_index_value = a[0, 0]
print(specific_index_value)
print(type(specific_index_value))
print(str(specific_index_value) + ' is a scalar, not a 1X1 matrix')
>> 1
>> <class 'numpy.int32'>
>> 1 is a scalar, not a 1X1 matrix

sliced_index_value = a[:1, :1]
print(sliced_index_value)
print(type(sliced_index_value))
print(str(sliced_index_value) + ' is a matrix, with shape {}'.format(sliced_index_value.shape))

>> [[1]]
>> <class 'numpy.ndarray'>
>> [[1]] is a matrix, with shape (1, 1)

这有意义吗? 祝你好运!