2014-10-03 70 views
2


我使用numpy的1.6.2蟒蛇2.7具有非常大的矩阵的工作不对齐元素的缺失。 给定一个N x M矩阵A和一个地图B我可以找到,为每行,删除元素的索引。 下面是一个例子:的Python:优化在numpy的阵列

A = 

    26 55 29 30 
    31 65 34 35 
    36 75 39 40 
    41 85 44 45 
    46 95 49 50 

B = 

    2 
    0 
    1 
    3 
    2 

结果将是:

A = 

    26 55 30 
    65 34 35 
    36 39 40 
    41 85 44 
    46 95 50 

实际上获得这个我创建一个循环是这样的:

for i in xrange(size(B)): 
    A[i,:] = concatenate(A[i,0:B[i]],A[i,B[i]+1:]) 

但它实在是太慢了。 有没有更快的方法来删除我需要的元素?

谢谢大家!

回答

4

你可以为A这样创建遮罩:

>>> mask = np.arange(4) != np.vstack(B) 
>>> mask 
array([[ True, True, False, True], 
     [False, True, True, True], 
     [ True, False, True, True], 
     [ True, True, True, False], 
     [ True, True, False, True]], dtype=bool) 

然后用它来从A过滤掉不需要的(False)值,重塑,然后重新绑定到变量名A

>>> A = A[mask].reshape(5, 3) 
>>> A 
array([[26, 55, 30], 
     [65, 34, 35], 
     [36, 39, 40], 
     [41, 85, 44], 
     [46, 95, 50]]) 

这应该是比使用concatenate因为它避免了复制阵列的Python的for循环的每次迭代更快。

+0

它的工作原理!改进约为5倍。谢谢! – Rowandish 2014-10-03 15:19:34