重排NumPy数组行条目

4

我正在尝试将一个numpy数组A转换为B,而不使用循环。

A=np.array([[1,2,3],
            [1,3,0],
            [2,0,0]])

B=np.array([[1,2,3],
            [1,0,3],
            [0,2,0]])

所以在每一行中,我想使用它们的值作为索引来重新排序条目。(例如,在第二行中,[1,3,0],1是第一个条目,3是第三个条目,而0将填充为第二个条目,使其成为[1,0,3])。
我可以针对单个行执行此操作,因此我可以循环遍历数组,但我想看看是否有一种方法可以在不使用循环的情况下完成此操作。我知道循环对于像这样的小型数组不会有任何区别,但当使用大型数组(1m,1m)时,我担心循环会创建瓶颈。
谢谢!
2个回答

1
有趣的问题,+1。
In [28]:

import numpy as np
A=np.array([[1,2,3],
            [1,3,0],
            [2,0,0]])
In [29]:

B=np.zeros(A.shape, 'int64')+np.arange(1, A.shape[0]+1)
In [30]:

np.where(np.asarray(map(np.in1d, B, A)), B, 0)
Out[30]:
array([[1, 2, 3],
       [1, 0, 3],
       [0, 2, 0]])
In [31]:

%timeit np.where(np.asarray(map(np.in1d, B, A)), B, 0)
10000 loops, best of 3: 156 µs per loop

太棒了!这正是我在寻找的。我之前卡住了,因为不知道如何在多维数组上使用np.in1d。为什么map()会将每一行拆分成单独的数组? - user3357979
map正在执行np.in1d(B[0], A[0])np.in1d(B[1], A[1])np.in1d(B[2], A[2]),......这就是诀窍,;P。 - CT Zhu

1

采用不同的方法来实现相同的事情。对于大型数组,可能会更快:

>>> mask = A != 0
>>> rows, cols = A.shape
>>> idx = (A - 1 + (np.arange(rows)*cols)[:, None])[mask]
>>> B = np.zeros_like(A)
>>> B.ravel()[idx] = A[mask]
>>> B
array([[1, 2, 3],
       [1, 0, 3],
       [0, 2, 0]])

它将A的非零条目转换为平坦数组中的索引,然后使用这些索引将A的非零条目复制到B的平坦视图中的正确位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接