簡體   English   中英

從向量與向量上的函數輸出創建 numpy 矩陣

[英]Create numpy matrix from output of function on vector vs vector

我有兩個向量/一維numpy數組和一個我想應用的函數:

arr1 = np.arange(1, 5)
arr2 = np.arange(2, 6)
func = lambda x, y: x * y

我現在想構造一個包含函數輸出值的n * m矩陣(其中nm分別是arr1arr2的長度)。 使用 for 循環的幼稚方法如下所示:

np.array([[func(x, y) for x in arr1] for y in arr2])

我想知道是否有更智能的矢量化方法使用arr1[:, None]語法來應用我的函數 - 請注意我的實際函數要復雜得多,不能分解為簡單的numpy操作( arr1[:, None] * arr2[None, :]不起作用)。

這是您的循環方法和@I'mahdi 的方法之間的一些比較:

import time
arr1 = np.arange(1, 10000)
arr2 = np.arange(2, 10001)


start = time.time()
np.array([[func(x, y) for x in arr1] for y in arr2])
print('loop: __time__', time.time()-start)

start = time.time()
(arr1[:, None]*arr2[None, :]).T
print('* __time__', time.time()-start)

start = time.time()
np.einsum('i, j -> ji', arr1, arr2)
print('einsum __time__', time.time()-start)

start = time.time()
np.matmul(arr2[:,None], arr1[None,:])
print('matmul __time__', time.time()-start)

輸出:

loop: __time__ 70.3061535358429
* __time__ 0.43536829948425293
einsum __time__ 0.508014440536499
matmul __time__ 0.7149899005889893

當你有numpy.array時,一種方法可以是numpy.einsum 因為你想計算這個: arr1_i * arr2_j -> insert to arr_result_ji

>>> np.einsum('i, j -> ji', arr1, arr2)
array([[ 2,  4,  6,  8],
       [ 3,  6,  9, 12],
       [ 4,  8, 12, 16],
       [ 5, 10, 15, 20]])

或者您可以使用numpy.matmul或使用@

>>> np.matmul(arr2[:,None], arr1[None,:])
# OR
>>> arr2[:,None] @ arr1[None,:]
array([[ 2,  4,  6,  8],
       [ 3,  6,  9, 12],
       [ 4,  8, 12, 16],
       [ 5, 10, 15, 20]])

暫無
暫無

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

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