我有一个二维数组,它有很多行(超过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没有此功能。
有人可以给我一种有效的方法吗?非常感谢你!
答案 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]