【问题标题】:Numpy, change array's row value , each row satisfy different conditionsNumpy,改变数组行值,每一行满足不同的条件
【发布时间】:2018-07-26 19:30:10
【问题描述】:

我有一个二维数组,它有大量的行(大于 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。

第 2 行有 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没有这个能力。

谁能给我一个有效的方法?非常感谢!!!

【问题讨论】:

  • 抱歉,我想我对您的 majoritybiggest 术语感到困惑。这是两个不同的东西。认为您可以删除此问题并将此问题的详细信息添加到您的旧问题中,然后我们尝试解决该问题。
  • 对不起,这是一个语法错误,我修改了我的问题
  • 没有最大的,只有多数。第二多数,第三多数。
  • @Divakar 你好,我修改了我的问题的详细内容,你现在明白了吗?
  • 是的,让我们将这个问题保留为通用问题。

标签: arrays numpy


【解决方案1】:

这是一种方法 -

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多