numpy数组的下标从1开始,numpy数组下标
主要介绍Numpy的各种下标操作的示例代码,非常详细,有一定的参考价值。感兴趣的朋友可以参考一下。
00-1010技术背景:二维矩阵的选取采用单行单元素下标的列表和元组格式来区分冒号。list和numpy.array的现有选择方法不兼容。两个冒号的组合使用None作为扩展维高维矩阵的选择方法。摘要
目录
本文使用的Numpy版本是:Version: 1.20.3。基于Python和C开发的Numpy一般被认为是Python中最好的Matlab替代品,最常见的就是各种Numpy矩阵类型的运算。对于矩阵的运算,选择合适的轴和元素是非常重要的。在这里,我们来看看一些常见的Numpy下标和标记。
技术背景
这里,我们定义一个4*4的矩阵来脱标。为了便于理解,这个矩阵中的所有元素都是不同的:
In [1]:将numpy作为np导入
In [2]: x=np.arange(16)。整形((4,4))
在[3]: x
[3]:
数组([[ 0,1,2,3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
二维矩阵的取法
比如我们要取第一行的所有元素,就是x[0],我们要取第一行第一列的元素,就是x[0][0]。在numpy中,为简单起见,可以说x[0][0]以x[0,0]的形式书写:
在[4]:中id=0
[5]: x[id]
Out[5]:数组([0,1,2,3])
在[6]: x[id][id]
Out[6]: 0
在[7]: x[id,id]
[7]: 0
取单行和单个元素
上一章提到的取单个元素x[0,0]的方法,其实本质上等价于x[(0,0)],也就是一个元组格式。但是,如果把这里的元组格式改成list,表达的意思和得到的结果就完全不一样了:
In [8]: id=[1,1]
[9]: x[id]
[9]:
数组([[4,5,6,7],
[4, 5, 6, 7]])
在[10]: x[id,id]
Out[10]:数组([5,5])
In [11]: id=(1,1)
[12]: x[id]
Out[12]: 5
这里list格式的id是指分别取第二行和第二行的内容,然后放入一个完整的矩阵中。如果id设置为[1,2],则分别取第二行和第三行,而不是第二行的第二个元素。如果需要取第二行第二列的元素,还是需要使用tuple格式来获取标签。有趣的一点是,如果你把刚才的下标输入两次,也就是x[[1,2],[1,2]],就意味着分别取x[1][1]和x[2][2],然后放在同一个矩阵里,这也是一种常用的分隔下标的方法。
下标的list和tuple格式区分
在Numpy的下标中,冒号和尾随逗号同时出现,表示取x的第一行所有数据,例如x [0,3360]表示取第一列所有数据,x [3360,0]表示取第一列所有数据:
[14]:中id=1
在[15]: x[id,]
Out[15]:数组([4,5,6,7])
在[16]: x[:id]
Out[16]:数组([1,5,9,13])
冒号的使用
虽然我们上面提到,如果下标定义为列表格式,就意味着单独取。但是目前在Numpy的实现中还存在这样一个遗留问题,就是使用多维列表格式去除标签会自动将最外层转换成元组格式,采用元组的方法。虽然计算时会报警,但目前需要注意。
在[1
7]: id = [[1],[1]]
In [18]: x[id]
<ipython-input-18-23f8764f4b7e>:1: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
x[id]
Out[18]: array([5])
In [19]: id = np.array([[1],[1]])
In [20]: x[id]
Out[20]:
array([[[4, 5, 6, 7]],
[[4, 5, 6, 7]]])
两个冒号的组合用法
在Numpy中冒号不与后置逗号同时出现时,表示的含义是从冒号前的元素取值到冒号后的元素,比如x[0:3]所表示的元素是[x[0],x[1],x[2]]。如果是两个冒号连用中间没有逗号的话,比如x[0:3:2],表示的是每隔2个元素取一个,最后得到的应该是[x[0],x[2]]。还有一种非常常见的操作是取[::-1]这样的下标,所表示的含义就是对当前轴进行倒序。
In [31]: x[::-1]
用None作扩维
虽然在Numpy中有broadcast和expand_dim之类的函数可以对矩阵进行扩维或者是广播,但是更方便的操作是对需要扩展的维度取一个None的下标,比如要把一个(4,4)大小的矩阵扩展成(1,4,4),那么就对下标取[None,:]或者[None,:,:]即可。而如果需要把(4,4)变成(4,1,4),那就需要把None换个位置为[:,None,:]就可以实现:
In [33]: x[None,:]
高维矩阵的取法
在高维矩阵中,因为没有了行和列这样的概念,因此需要从轴上去理解相关操作,我们先定义一个简单的三维张量:
In [49]: y = np.arange(32).reshape((2,4,4))
常规的操作其实都跟前面章节中介绍二维张量一致,这里我们考虑一种比较特殊的场景。就是如果同样用二维矩阵的取法去取,只是第一条轴每个元素取一个id,比如取第0条轴的[0,1]元素和第1条轴的[2,3]元素,那么其实最简单的方案就是在第一个下标的位置加上一个位置元素,这个位置元素用下标id的第一个轴的长度去定义即可:
In [58]: id = np.array([[0,1],[2,3]])
总结概要
这篇文章的主要内容是梳理在Numpy中经常用到的各种取下标的操作,包括但不限于取指定轴的所有元素、取指定位置的单个元素、取指定位置的多个元素、扩维以及取未显式给定位置的多个元素等等。比较重要的是在Numpy中tuple的取法和list的取法是代表不一样的含义,并且由于历史原因,Numpy中存在一些list取法和numpy.array的取法表示不一致的地方,在本文中进行了总结。
到此这篇关于Numpy的各种下标操作的示例代码的文章就介绍到这了,更多相关Numpy 下标 内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。