在numpy数组中,我想将一列复制到另一个矩阵并从原始矩阵中删除该列

时间:2015-03-02 23:00:54

标签: python arrays numpy matrix copy

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

垫子矩阵形状可以是10000 * 5。这里只是一个例子

这里我定义了一个函数。它试图找到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不要复制,只需删除。

例如,be = 0,ba = 6,bb = 3

返回列表应为:

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

该函数将返回mat,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

在我的代码中,我发现一旦某些列匹配条件,矩阵垫长度总是减少。它会追加并删除错误的列。附加内容是附加地址还是深层复制?

如果使用

for col in mat:

然后如何在垫子中删除自己? 或者编写此代码的任何有效方式?

问题已更新......

1 个答案:

答案 0 :(得分: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]]

我希望上面的例子可以帮助您开始自己的项目。有一件事可能有点令人困惑,上面代码中的~用作&#34;逻辑不&#34;运营商。它可以以类型bool的numpy数组的方式使用,但要小心,因为它对其他python对象具有不同的含义(它被称为补码运算符)。