我嘗試m與m評估一起構建向量樣本(帶有整數條目)。如果其條目之一是數字,則x對形狀向量進行(n,1)評估。否則,它被評估為。
為了處理許多這樣的向量和評估,樣本向量存盤在一個-shape 中,評估存盤在一個-shape 中。看代碼:y=12y=0(n,m)ndarray(1,m)ndarray
import numpy as np
n = 10 # number of entries in each sample vector
m = 1000 # number of samples
X = np.random.randint(-10, 10, (n, m))
Y = []
for i in range(m):
if 2 in X[:, i]:
Y.append(1)
else:
Y.append(0)
Y = np.array(Y).reshape((1,-1))
assert (Y.shape == (1,m))
如何矢量化 的計算Y?我試圖取代的初始化/計算X,并Y通過如下:
X = np.random.randint(-10,10,(n,m))
Y = np.apply_along_axis(func1d=lambda x: 1 if 2 in x else 0, axis=0, arr=X)
幾次執行表明,這在大多數情況下甚至比我的第一種方法慢一點。(實際上這個分析者首先說這numpy.apply_along_axis不是為了速度。我也不知道lambda在這種情況下有多好。)
有沒有辦法對 的計算進行矢量化Y,即根據該列是否包含元素來分配值1或分配0給每一列2?
uj5u.com熱心網友回復:
使用 Numpy 陣列和邏輯陳述句時,它會進行大量優化,而無需用戶手動矢量化任務。以下代碼達到了相同的解決方案:
# assign logical 1 where element == 2 everywhere in the array X,
# then, for each column (axis = 0), if any element == 1 assign column logical 1
Y = (X == 2).any(axis = 0).reshape(1, -1)
print(Y.shape)
使用 timeit 來評估執行時間:
回圈方法:每次運行 3240 微秒
numpy 方法:每次運行 6.57 微秒
如果您有興趣,可以看看使用其他向量化方法(例如 np.vectorise)是否可以進一步縮短時間,盡管我很確定底層 Numpy 優化默認在 CPU 指令級別 (SIMD) 執行自己的向量化。
底線是使用 numpy 時總是嘗試使用邏輯陣列和 numpy 函式/方法找到解決方案,因為它們已經在編譯后的二進制檔案中進行了大量優化,并且用于操作、訪問或迭代資料的任何 python 函式都會減慢執行速度速度驚人。
順便說一句,加快 for 回圈執行以構建輸出串列(例如您所做的)的最常見方法是使用串列理解:
Y = np.array([2 in X[:, i] for i in range(m)]).reshape((1, -1))
每個回圈以 3070 微秒執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/368011.html
上一篇:為什么np.random.randn和np.zeros采用不同型別的引數?
下一篇:優化這個numpy操作
