【Python】数组索引到底怎么整?

本文主要探索如何在python中获得一个数组里的指定行和列(子数组)。

【生成数组】

我们要获得子数组,首先得生成一个数组,这里调用python里的numpy库,生成一个5行3列的顺序顺组。

import numpy as np
a = np.arange(15).reshape((5, 3))

结果如下图:
在这里插入图片描述

【获得子数组索引】

比如我们要取出 a 数组中的第2,4行和第1,2列生成数组 b ,数组 b 如下图所示:
在这里插入图片描述
由于python中数组的索引是从0开始的,那么此时我们的行索引就是[1,3],列索引就是[0,1]。

【使用索引取数据】

如果直接像matlab一样,行列一起索引,得到的结果有点意外。如下图所示:
在这里插入图片描述
所以,我们行和列分开取数据

b = a[:,[0,1]]
b = b[[1,3],:]

结果如下图:
在这里插入图片描述
这里就是先把第1,2列取出来生成新数组,然后在新数组里取出2,4行。当然行列取出的顺序可以更换。

【BUG】

以上其实还是很简单的,如果使用过matlab,可以说的很好理解的,但是就是这个python数组索引,我居然搞了两天,时刻怀念matlab。

大家注意,上面这些是在命令行里执行的,如果放到代码中,可能会出现以下问题:

IndexError: too many indices for array
TypeError: list indices must be integers or slices, not tuple
TypeError: only size-1 arrays can be converted to Python scalars

简直让你分分钟崩溃,就是个数组索引,python怎么这么会玩?

【DEBUG】

1、首先注意我们是从数组 a 里获得子数组 b ,所以如果你 a 的格式(type)是列表(list)的话,你需要转成数组

a= np.array(a)

2、行索引和列索引的格式是列表,而不是数组,转换函数如下:

Index = Index.tolist();

3、如果上面两个格式对了,但是还是报错的话,你需要考虑一下,你代码中类(class)里的对象(object)里的数据成员调用问题在这里插入图片描述
首先,我们在方法__init__中定义了,很多数据成员,如self.feats = []。
在这里插入图片描述
然后,如果你在其他方法中要调用它的时候,又重新对他初始化,如上图:

feats = feats + 2

再对其进行运算时,可能就报错了。

所以,在调用这些数据时,全部从类中导出,比如

self.feats = self.feats + 2

这样就避免了很多问题~

发布了15 篇原创文章 · 获赞 5 · 访问量 4117

猜你喜欢

转载自blog.csdn.net/YaoYee_21/article/details/105117751
今日推荐