2015-03-02 253 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