[英]Rearranging entries of rows in numpy array
我試圖將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)上進行循環會產生瓶頸。
謝謝!
有趣的問題,+ 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
獲得相同的東西的不同方法。 大型陣列可能會更快:
>>> 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
的展平視圖中的右側位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.