首页 > 其他分享 >numpy中的切片中的None含义

numpy中的切片中的None含义

时间:2023-07-28 09:46:16浏览次数:34  
标签:None 切片 shape newaxis 维度 array numpy

pytorch的tensor同理。

先说结论:

None实际上是增加了一个维度,它不是原维度的索引。

为什么引入None

说一下我找原文档的心路历程:

numpy的官方文档里搜索“slice”,也就是切片,很容易就能找到关于slice的介绍:

Basic slicing extends Python’s basic concept of slicing to N dimensions. Basic slicing occurs when obj is asliceobject (constructed bystart:stop:stepnotation inside of brackets), an integer, or a tuple ofsliceobjects and integers.Ellipsisandnewaxisobjects can be interspersed with these as well.

简单来说就是numpy的切片扩展了python的切片。当索引是切片对象(由括号内的start:stop:step语法构造)、整数、切片对象的元组或整数的元组,切片操作就会发生。后面一句话特别重要:省略号和newaxis对象也可以穿插其中

省略号就是python语法的“...”,那么newaxis是什么呢?直觉告诉我它和None有关。找到newaxis的文档,里面第一句话就是:

A convenient alias for None, useful for indexing arrays.

也就是说,numpy.newaxis是None的别名,在索引数组时有用。而文档紧接着给的例子也特别直接:

 

第一句newaxis is None , is None 。。。

官方这么直白,这下不用我多说,你也知道None是什么意思了吧?None就是newaxis,也就是建立一个新的索引维度。其实就是为了写法上的方便,本来新建一个维度用reshape函数、unsqueeze函数也可以做到。其实文档后面也给出了解释[3]

This can be handy to combine two arrays in a way that otherwise would require explicit reshaping operations.

这种写法很方便地把两个数组结合起来,否则,还需要明确的reshape操作。

那么,怎么用呢?

以一维为例

x = np.arange(3) # array([0, 1, 2])

( 注意,这个一维数组的shape是(3,),而不是(1,3),初学者很容易犯错。)

如果想把x的shape变成(1,3),只需要把None放在第一个维度的位置,以下两种写法等价:

x[None,:]
x[None]

结果如下:

array([[0, 1, 2]])

如果想把x的shape变成(3,1),只需要把None放在第二个维度的位置:

x[:,None]

结果如下:

array([[0],
       [1],
       [2]])

其实,None可以任意添加和组合,例如下面的写法:

x[None,:,None,None]

结果如下:

array([[[[0]],
        [[1]],
        [[2]]]])

这个数组的shape是(1,3,1,1)。

以二维为例

x = np.arange(6).reshape((2,3))

x如下:

array([[0, 1, 2],
       [3, 4, 5]])

在第一个维度插入,以下三种写法等价:

x[None]
x[None,:]
x[None,:,:]

输出结果如下,shape为(1, 2, 3):

array([[[0, 1, 2],
        [3, 4, 5]]])

在第二个维度插入,以下两种写法等价:

x[:,None]
x[:,None,:]

输出结果如下,shape为(2, 1, 3):

array([[[0, 1, 2]],
       [[3, 4, 5]]])

在第三个维度插入:

x[:,:,None]

输出结果如下,shape为(2, 3, 1):

array([[[0],
        [1],
        [2]],

       [[3],
        [4],
        [5]]])

 

更高维的情况以此类推。

这种写法一般在进行矩阵运算的时候会用到。比如:

x = np.arange(5)
x[:, None] + x[None, :]

这样可以很优雅地获得 列向量+行向量 的结果(划重点:优雅~):

array([[0, 1, 2, 3, 4],
      [1, 2, 3, 4, 5],
      [2, 3, 4, 5, 6],
      [3, 4, 5, 6, 7],
      [4, 5, 6, 7, 8]])

参考

  1. https://zhuanlan.zhihu.com/p/486373530?utm_id=0

标签:None,切片,shape,newaxis,维度,array,numpy
From: https://www.cnblogs.com/chentiao/p/17586753.html

相关文章

  • 【go语言】2.2.1 数组和切片
    数组和切片是Go语言中常用的数据结构,它们都可以存储多个同类型的元素。数组数组是具有固定长度的数据类型,它的长度在定义时就已经确定,不能随意改变。你可以使用以下方式定义一个数组:vararr[3]int这段代码定义了一个长度为3的 int 类型数组 arr。你也可以在定义时初......
  • numpy.tile()函数用法
    >>>importnumpy>>>numpy.tile([0,0],5)#在列方向上重复[0,0]5次,默认行1次array([0,0,0,0,0,0,0,0,0,0])>>>numpy.tile([0,0],(1,1))#在列方向上重复[0,0]1次,行1次array([[0,0]])>>>numpy.tile([0,0],(2,1))#在列方向上重复[0,0]1次,行2次array([[0......
  • numpy.linspace()函数
    pythonnumpy中linspace函数numpy提供linspace函数(有时也称为np.linspace)是python中创建数值序列工具。与Numpyarange函数类似,生成结构与Numpy数组类似的均匀分布的数值序列。两者虽有些差异,但大多数人更愿意使用linspace函数,其很好理解,但我们需要去学习如何使用。本文我......
  • 最新基于nonebot的qq机器人搭建
    导读核心资源(参考各项目到各自release下载NoneBot简介|go-cqhttp帮助中心qq登录需要包签名,要自己部署https://github.com/fuqiuluo/unidbg-fetch-qsign环境ubuntu:win10商店直接下个ubuntu做wsl,python:wsl里面安装conda,conda创建虚拟环境使用python最新3.11java......
  • (数据科学学习手札153)基于martin的高性能矢量切片地图服务构建
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,在日常研发地图类应用的场景中,为了在地图上快速加载大量的矢量要素,且方便快捷的在前端处理矢量的样式,且矢量数据可以携带对应的若干属性字段,目前主流的做法......
  • Numpy学习笔记之Numpy练习
    练习1:分别按照要求,生成一个一维数组、二维数组,并且查看其shapea1=np.array([1,2,'a','hello',[1,2,3],{'one':100,'two':200}])a2=np.array([list(range(6)),list('abcdef'),[True,False,True,False,True,True]])print(a1,'......
  • Numpy学习笔记
    一、Numpy基础数据结构NumPy数组是一个多维数组对象,称为ndarray。其由两部分组成:①实际的数据②描述这些数据的元数据二、常见方法importnumpyasnpar=np.array([[[1,2,3,4,5,6,7],[1,2,3,4,5,6,7],[1,2,3,4,5,6,7]],[[1,2,3,4,5,6,7],[1,2,3,4,5,6,7],[1,2,3,4,5,......
  • (数据科学学习手札153)基于martin的高性能矢量切片地图服务构建
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,在日常研发地图类应用的场景中,为了在地图上快速加载大量的矢量要素,且方便快捷的在前端处理矢量的样式,且矢量数据可以携带对应的若干属性字段,目前主流的做法......
  • 3.7的python 应该安装什么版本的numpy
    3.7的Python应该安装什么版本的NumPyNumPy是一个用于Python的开源数学库,它提供了一个高效的多维数组对象以及用于处理这些数组的数学函数。在Python中进行科学计算和数据分析时,NumPy是不可或缺的工具之一。然而,由于Python的版本迭代更新,我们需要了解3.7版本的Python应该安装什么版......
  • Python报错 | AttributeError: 'NoneType' object has no attribute 'group'
    报错信息使用Python正则匹配的时候,报如下错误:AttributeError:'NoneType'objecthasnoattribute'group'错误原因报错翻译过来是:属性错误:“NoneType”对象没有属性“group”没有匹配到符合正则表达式的内容,但又调用了group方法。importrestr='hellopython!!!hel......