python [:,2][:,None]是什么意思

看别人代码看到的,原生的应该没有这种语法吧。
是numpy库里的吗?

阅读 38.5k
5 个回答

python 是支持多维切片语法的,只是python自身没有用到。平时,就看到numpy里用了。


[:,2]看切片原理:
图片描述


[:,None]

None表示该不进行切片,而是将该整体作为数组元素处理。

所以,[:,None]的效果就是将二维数组按每行分割,最后形成一个三维数组

我来解释一下语法。[:,2] 这是下标操作,对应于特殊方法 __getitem__(self, xxx) 以及 __setiterm__(self, xxx, value),其中 xxx 就是 [] 里边的那个值。

那么,[:,2] 里边是个什么东西呢?我们看看:

>>> class T:
...   def __getitem__(self, x):
...     print(x)
... 
>>> t = T()
>>> t[:,2]
(slice(None, None, None), 2)

首先呢,由 , 构造了一个两个元素的 tuple。前一个元素是 :,后一个是 2。而在下标操作中,: 是特殊的:它会构造一个 slice 对象。完整的语法是:start:stop:step,省略的部分取默认值 None。省略 step 时也可以省掉它前边的冒号。

详情可以查阅文档的 Language Reference 相关部分。

相对于一维数组而言,二维(多维)数组用的会更多。一般语法是arr_name[行操作, 列操作]
先随机产生一个3*4的数组。

arr = np.arange(12).reshape((3, 4)) 

out:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
  • 取行数据
arr[i, :] #取第i行数据
arr[i:j, :] #取第i行到第j行的数据
  • 取列数据(注意数据格式)
arr[:,0] # 取第0列的数据,以行的形式返回的
out:
array([0, 4, 8])

arr[:,:1] # 取第0列的数据,以列的形式返回的
out:
array([[0],
       [4],
       [8]])
  • 取一个数据块
# 取第一维的索引1到索引2之间的元素,也就是第二行 
# 取第二维的索引1到索引3之间的元素,也就是第二列和第三列
arr[1:2, 1:3] 

out: 
array([[5, 6]])


 # 取第一维的全部 
 # 按步长为2取第二维的索引0到末尾之间的元素,也就是第一列和第三列
arr[:, ::2]

out: 
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10]])

numpy里面的多维数组切片

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题