重新排列numpy数组中的行条目

时间:2014-02-27 15:26:12

标签: python arrays numpy

我正在尝试将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]])

所以在每一行中,我想使用它们的值作为索引对条目重新排序。 (即在第2行,[1,3,0],1是第一个条目,3是第三个条目,0将作为第二个条目填入[1,0,3]

我可以为一行做这个,所以我可以循环遍历数组,但我想看看是否有办法在没有循环的情况下执行此操作。我知道循环对像这样的小型数组没有什么不同,但是我担心在大型数组(1m,1m)上进行循环会产生瓶颈。

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的非零条目复制到其{1}的展平视图中的正确位置{1}}。