numpy,更改数组的行值,每行满足一个特殊条件

时间:2018-07-26 09:28:07

标签: arrays numpy

我有一个二维数组,它有很多行(超过5000行)。

为简单起见,假设A是我矩阵的简单版本

A=([[1,2,2,3,3,3],
   [[2,1,1,7,7,7],
   [[4,4,1,1,1,1]])

现在,A只有3行:

第一行具有3个值:1、2、3、3。

第二行具有3个值,一个2,两个1,三个7。

最后一行有2个值,两个4,四个1。

现在我可以轻松找到每一行的多数值:

1st是3,2nd是7,3rd是1。(意味着我的代码已经找到每一行的多数值并将其存储为[3,7,1])

我要做的是将每一行的多数值设置为0。

方法设置

A=([[1,2,2,0,0,0],
   [[2,1,1,0,0,0],
   [[4,4,0,0,0,0]])

A只是一个简单的实例。我的矩阵有很多行。

那么,如何更轻松,更有效地执行此操作?

我不想编写for循环来为每一行设置值。

(意味着我可以做A [0,A [0,:] == 3] = 0,A [1,A [1,:] == 7] = 0,A [2,A [2, :] == 1] = 0,但这太复杂了

我想要的是这样的表格:

A[:,A[:,:]==[3,7,1]]=0

但是numpy没有此功能。

有人可以给我一种有效的方法吗?非常感谢你!

对于更一般的情况,如果我想将每行的第1个最大值设置为0,将第2个最大值设置为-1,将第3个最大值(如果存在)设置为-2 ....,该怎么做? >

设置方式:

A=([[-2,-1,-1,0,0,0],
   [[-2,-1,-1,0,0,0],
   [[-1,-1,0,0,0,0]])

1 个答案:

答案 0 :(得分:2)

方法1

使用2D bincount-

# https://stackoverflow.com/a/46256361/ @Divakar
def bincount2D_vectorized(a):    
    N = a.max()+1
    a_offs = a + np.arange(a.shape[0])[:,None]*N
    return np.bincount(a_offs.ravel(), minlength=a.shape[0]*N).reshape(-1,N)

A[A==bincount2D_vectorized(A).argmax(1)[:,None]] = 0

样品运行-

In [16]: A
Out[16]: 
array([[1, 2, 2, 3, 3, 3],
       [2, 1, 1, 7, 7, 7],
       [4, 4, 1, 1, 1, 1]])

In [17]: A[A==bincount2D_vectorized(A).argmax(1)[:,None]] = 0

In [18]: A
Out[18]: 
array([[1, 2, 2, 0, 0, 0],
       [2, 1, 1, 0, 0, 0],
       [4, 4, 0, 0, 0, 0]])

方法2

有效地使用2D mode-

A[A==mode(A.T,axis=0)[0][:,None]] = 0

或者,通过相同的问答,我们可以使用Scipy-

from scipy import stats

A[A==stats.mode(A.T)[0][0][:,None]] = 0