numpy,更改数组的行值,每行满足不同的条件

时间:2018-07-26 09:58:13

标签: 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。

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

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

每行的第二和第三多数值也很容易找到,对于第二多数值,第一行是2,第二是1,第三是4。(这意味着我的代码已经找到每一行第二多数值并存储它们为[2,1,4])。

对于第三,第四,第五...多数值,仍然很容易找到。

我想做的是将每行第一多数值设置为0,第二多数值设置为-1,第三多数值(如果存在)设置为-2 ....,该怎么做?

设置方式:

A=([[-2,-1,-1,0,0,0],
   [[-2,-1,-1,0,0,0],
   [[-1,-1,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

A[:,A[:,:]==[2,1,4]]=-1


A[:,A[:,:]==[1,2]]=-2 

但是numpy没有此功能。

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

1 个答案:

答案 0 :(得分:2)

这是一种方法-

# 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)

binsum = bincount2D_vectorized(A)
m,n = A.shape[0],binsum.shape[1]

index = np.empty((m,n), dtype=int)
sort_idx = binsum.argsort(1)[:,::-1]
index[np.arange(m)[:,None], sort_idx] = np.arange(0,-n,-1)
out = index[np.arange(m)[:,None],A]