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=[]

  運行結果正確,到這里我們就完成了數據的篩選即方程式的運算。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM