簡體   English   中英

從 numpy 中的一維數組創建方形 nxn 矩陣的最快方法

[英]Fastest way to create a square nxn matrix from 1d array in numpy

假設以下 numpy 數組:

arr = np.array([0, 1, 2, 3, 4]) # can be any array

我想知道生成以下操作的最快方法:

n = arr.shape[0]
result = np.tile(arr, (n, 1)) - arr.reshape((-1, 1))
print(result):

array([[ 0,  1,  2,  3,  4],
       [-1,  0,  1,  2,  3],
       [-2, -1,  0,  1,  2],
       [-3, -2, -1,  0,  1],
       [-4, -3, -2, -1,  0]])

(1) 如何高效地創建矩陣“結果”(因為 n >> 0 可能非常大)?

(2) 這個矩陣有特定的名稱嗎?

這有點快:

result = arr-arr[:,None]

粗略的基准,沒有科學依據。 (使用 arr 計時 100 次):

          5 items (arr) 100 times   10,000 items (np.arange) once
OP:       0.0006383560000000066     0.7902513520000001
This one: 0.0001735200000000381     0.3640661519999999
Kelly's:  0.00027326299999996806    0.36036748900000015 (see comments)

將廣播與scipy.linalg.toeplitz和 OP 進行比較:

N = 1000
arr = np.arange(N)

%timeit np.tile(arr, (N, 1)) - arr.reshape((-1, 1))
1.83 ms ± 53.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit arr - arr[:, None]
1.11 ms ± 25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit scipy.linalg.toeplitz(-arr, arr)
727 µs ± 21.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
N = 10000
arr = np.arange(N)

%timeit np.tile(arr, (N, 1)) - arr.reshape((-1, 1))
184 ms ± 9.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit arr - arr[:, None]
85.3 ms ± 597 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit scipy.linalg.toeplitz(-arr, arr)
70.6 ms ± 573 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

似乎 scipy 解決方案通常更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM