我有 2 個 numpy 陣列:
a= np.array([[2, 1, 7],
[7, 7, 3],
[1, 7, 4]])
b= np.array([9,-1,17])
我想用 from 的值更改7每一列中的,這樣在第一列中 s 被替換為from 的第一個值,在第二列中,s 被替換為 from 的第二個值,依此類推。ab7b7b
我的簡單解決方案是:
for j in range(len(b)):
a[a[:,j]==7,j]=b[j]
array([[ 2, 1, 17],
[ 9, -1, 3],
[ 1, -1, 4]])
它有效,但對于非常大的矩陣,它不夠快。還有另一種更快的方法嗎?
uj5u.com熱心網友回復:
假設計算矩陣很大,您可以使用 Numba 實作快速并行版本。此實作比使用純 Python 回圈的初始解決方案快得多,后者創建許多小的臨時陣列和低效的非連續記憶體訪問模式(例如 . a[:,j])。np.where(a == 7, b, a)由于需要填充大量臨時陣列并且可能不適合 RAM(導致作業系統使用非常慢的交換記憶體),因此它也比使用快得多。使用多執行緒也提供了很大的加速。這是代碼:
import numba as nb
@nb.njit('void(int_[:,::1], int_[::1])', parallel=True)
def compute(a, b):
n, m = a.shape
assert b.size == m
for i in nb.prange(n):
for j in range(m):
if a[i,j] == 7:
a[i,j] = b[j]
以下是我在 100000x1000 矩陣上的 6 核機器上的結果(隨機 32 位整數在 0..10 中):
For loop: 683 ms
np.where: 169 ms
Numba: 37 ms
這個版本比初始版本快 18 倍,并且幾乎不占用更多記憶體(它就地作業)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410482.html
標籤:
