numpy——列表筛选及解方程式
当对array数组进行计算时,有时候需要筛选出题目所要求的数据,筛选对象可能是数字,也可能是字符串。这次我就来说说如何针对字符串进行筛选。
当有一个列表[['男', '2', '4', '40'], ["女",21,13,50],['男', '8', '6', '24']],要求解“男”方程式,也就是我们需要将含有字符串“男”的列表数据调出来,即将含有字符串“女”的列表删去。这一步我们需要用到函数np.delete()。
很容易就能想到如下方法:
bbb=np.array([['男', '2', '4', '40'], ["女",21,13,50],['男', '8', '6', '24']]) x,y=np.shape(bbb) for i in range(x):if bbb[0,i]!="男": bbb=np.delete(bbb,i,axis=0)
运行后发现程序并没有如我们所想删去“女”数据列,在代码中插入print()来测试是哪里运行不成功:
bbb=np.array([['男', '2', '4', '40'], ["女",21,13,50],['男', '8', '6', '24']]) x,y=np.shape(bbb) for i in range(x): print(i) if bbb[0,i]!="男": print("yes")
bbb=np.delete(bbb,i,axis=0)
运行结果为:0 1 2,即判断每一列第一个数据是否为“男”处不能成功判断。将bbb[i][0]改为bbb发现程序报错,但当单独判断时程序可以判断成功:
aaa=bbb=="女" aaa
我觉得可能是array数组对数据的误判,我将array转换成list后解决了该问题,成功筛选出"男"数据列:
aaa=bbb=="女" aaa=aaa.tolist() for i in range(x): print(i) if aaa[i][0]!=False: print("yes") bbb=np.delete(bbb,i,axis=0)
运行后程序正确输出yes
输出bbb显示结果为:
接下来就是进行方程式的运算,前两个数为x,y的系数,最后一个数为常数,将数据单独取出来并进行运算:
b=np.array(bbb[:,3:4]) a=np.array(bbb[:,1:3]) result=linalg.solve(a,b)
运行后发现程序报错,输出bbb发现数据类型为“<U2”,我认为可能是数据类型不是int型,将数据类型转换为int:
b=np.array(bbb[:,3:4],dtype="int32") a=np.array(bbb[:,1:3],dtype="int32") linalg.solve(a,b)
程序成功运行并得到正确结果:
但是这种方法有个缺陷,即列表中没有“男”数据或只有一个数据列时,程序会报错。
此时我们需要定义一个数得到bbb的shape的长度:
c=np.shape(bbb)
cc=len(c)
在给x,y赋值np.shape(bbb)前加入如上代码,判断cc长度为2,1或0,当判断为2时,运行之前的代码;为1则只给x赋值;为0直接返回空数组。代码如下:
bbb=np.array([['男', '2', '4', '40'], ["女",21,13,50],['男', '8', '6', '24']]) result=[] c=np.shape(bbb) cc=len(c) if cc==2: x,y=np.shape(bbb) for i in range(x): print(i) if bbb[0,i]!="男": print("yes") bbb=np.delete(bbb,i,axis=0) d=np.shape(bbb) dd=len(d) if dd==2: b=np.array(bbb[:,3:4],dtype="int32") a=np.array(bbb[:,1:3],dtype="int32") result=linalg.solve(a,b) else: return result=[] else: return result=[]
运行结果正确,到这里我们就完成了数据的筛选即方程式的运算。