我正在嘗試使用 numpy 向量化操作。但是我在以下任務中掙扎:設定是兩個不同長度的陣列(X1,X2)。我想對每一對應用一種方法(例如 X1[0] 與 X2[0]、X2[1] 等)。我使用回圈撰寫了以下作業代碼,但我想擺脫回圈。
result = []
for i in range(len(X1)):
result.append([])
for j in range(len(X2)):
tmp = my_method(X1[i] - X2[j])
result[i].append(tmp)
result = np.asarray(result)
uj5u.com熱心網友回復:
您可以使用reshape其中一個向量(N, 1),然后使用vectorize它將正常廣播操作:
import numpy as np
X1 = np.arange(5)
X2 = np.arange(3)
print(X1, X2)
# [0 1 2 3 4] [0 1 2]
def my_op(x, y):
return x y
np.vectorize(my_op)(X1[:, np.newaxis], X2)
# array([[0, 1, 2],
# [1, 2, 3],
# [2, 3, 4],
# [3, 4, 5],
# [4, 5, 6]])
請注意,這my_op只是作為示例定義的;如果您的函式實際上包含在 numpy 的矢量化操作中,那么直接使用它會更快,例如:
X1[:, np.newaxis] X2
uj5u.com熱心網友回復:
itertools.product 可能是你要找的:
from itertools import product
import numpy as np
x1 = np.array(...)
x2 = np.array(...)
result = np.array([my_method(x_1 - x_2) for x_1, x_2 in product(x1,x2)])
或者,您也可以使用雙重串列理解:
result = np.array([my_method(x_1 - x_2) for x_1 in x1 for x_2 in x2])
這顯然取決于my_method正在做什么和操作以及您存盤在x1和 中的內容x2。
uj5u.com熱心網友回復:
假設一個簡單的函式my_method(a, b),它將兩個數字相加。
這個輸入:
X1 = np.arange(10)
X2 = np.arange(10,60,10)
你的代碼是:
result = []
for i in range(len(X1)):
result.append([])
for j in range(len(X2)):
tmp = my_method(X1[i], X2[j])
result[i].append(tmp)
result = np.asarray(result)
您可以將其替換為廣播:
X1[:,None] X2
輸出:
array([[10, 20, 30, 40, 50],
[11, 21, 31, 41, 51],
[12, 22, 32, 42, 52],
[13, 23, 33, 43, 53],
[14, 24, 34, 44, 54],
[15, 25, 35, 45, 55],
[16, 26, 36, 46, 56],
[17, 27, 37, 47, 57],
[18, 28, 38, 48, 58],
[19, 29, 39, 49, 59]])
現在您需要查看您的操作是否可以矢量化……請分享您想要實作的目標的詳細資訊。可以使用 對函式進行矢量化numpy.vectorize,但這不是一個神奇的工具,因為它會在元素上回圈,這可能會很慢。最好是有一個真正的向量操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/338811.html
