我正在尝试将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)上进行循环会产生瓶颈。
谢谢!
答案 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}}。