2015-03-02 146 views
2
mat=[[0,1,5],[1,3,6],[-1,4,4],[1,2,2],[7,3,7],[2,5,3]] 

mat矩陣形狀可能是10000 * 5。這裏只是一個例子在numpy陣列中,我想複製一列到另一個矩陣,並從原始矩陣中刪除列

這裏我定義一個函數。它試圖找到mat [:,0] < be或mat [:,0]> ba或mat [:,1] < bb。如果一列與條件匹配,則元素[i,0] <爲元素[i,0] = be,然後將該列複製到另一個矩陣「swape」。還要從矩陣「mat」中刪除這一列。與mat [:,0]相同> ba或mat [:,1] < bb。對於mat [:,1] < bb,colume將複製到「swapt」,mat [:,0]> ba不復制,只需刪除。

例如是= 0,BA = 6,BB = 3

返回列表應該是:

mat=[[1,3,6],[2,5,3]] 
swape=[[-1,4,4]] 
swapt=[[1,2,2],[0,1,5]] 

該函數將返回墊,swape和SWAPT

def swapco(be,ba,bb,mat): 
     swape=np.array() 
     swapt=np.array() 
     leng=np.shape(mat)[0] 
     for i in range(leng): 
      if mat[i,2]<bb: 
       mat[i,2]=bb 
       np.append(swapt,i,1) 
       np.delete(mat, i, 0) 
      else: 
       if mat[i,0]>=ba:  
        mat[i,0]=ba 
        np.append(swape,i,1) 
        np.delete(mat, i, 0) 
       elif mat[i,0]<=be: 
        mat[i,0]=be 
        np.append(swape,i,1) 
        np.delete(mat, i, 0) 
      i+=1 

     return swape, swapt 

在我的代碼中,我發現一旦某些列匹配條件,矩陣墊的長度總是減小。它會追加和刪除錯誤的列。另外追加是追加一個地址或deepcopy?

如果使用

for col in mat: 

那麼如何刪除自己在墊子? 或者任何有效的方法來寫這個代碼?

問題更新中...

+0

我不完全清楚你想用你的代碼實現什麼:它看起來像你試圖追加到某個數組的索引你已經檢查了一定條件的列索引。你能否更新你的文章並添加一個數值例子,例如, '墊= np.reshape(np.arange(0,15),(5,3)); BA = 11; be = 5; BB = 3'? – 2015-03-02 23:44:57

+0

你不應該真的在循環中刪除矩陣的行或列。請記住,如果我在i = 1時刪除第1行,則第3行變爲第2行,第2行變爲第1行。現在,當i = 2時,您正在查看_old_第2行,這是_old_第3行。 _old_行2永遠不會在循環中檢查。 – 2015-03-03 00:55:31

回答

1

這是從你的代碼你想要做什麼,但讓我爲你寫的一個小例子,可以幫助您開始清理你的代碼真的不清楚。

import numpy as np 

def split(mat, a, b): 
    assert a < b 
    where_less_than_a = mat[:, 0] < a 
    where_less_than_b = mat[:, 0] < b 

    less_than_a = mat[where_less_than_a, :] 
    between_a_b = mat[(~where_less_than_a) & where_less_than_b, :] 
    greater_eq_b = mat[(~where_less_than_b), :] 
    return less_than_a, between_a_b, greater_eq_b 

mat = np.arange(27).reshape((9, 3)) 
x, y, z = split(mat, 4., 17.) 
print(x) 
# [[0 1 2] 
# [3 4 5]] 
print(y) 
# [[ 6 7 8] 
# [ 9 10 11] 
# [12 13 14] 
# [15 16 17]] 
print(z) 
# [[18 19 20] 
# [21 22 23] 
# [24 25 26]] 

我希望上面的例子可以幫助你開始你自己的項目。有一件事可能有點令人困惑,上面代碼中的~被用作「邏輯非」操作符。它可以以這種方式與bool類型的numpy數組一起使用,但要小心,因爲它對於其他python對象(它被稱爲補數運算符)具有不同的含義。

+0

你的回答非常有幫助。所以在where_less_than_b = mat [:, 0] c assert b> c?它看起來給我錯誤的通知... – rfeynman 2015-03-03 14:39:24

+0

您可以完全組合比較操作,例如'(mat [:, 0] c)'。確保包括括號。斷言不是真的需要,它只是懶惰的錯誤檢查。 – 2015-03-03 19:58:12