我有一个二维数组,它有很多行(超过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]])
答案 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