本文主要探索如何在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
这样就避免了很多问题~