2017-09-21 17 views
1

在Python中,我有一個列表和一個numpy數組。如何乘以列表來獲得多維數組?

我想乘以列表中的陣列以這樣的方式,我得到其中第三維表示輸入數組乘以列表的每個元素的陣列。因此:

in_list = [2,4,6] 
in_array = np.random.rand(5,5) 
result = ... 
np.shape(result) ---> (3,5,5) 

其中(0,:,:)是輸入數組乘以列表(2)的第一個元素; (1,:,:)是輸入數組乘以列表(4)的第二個元素,等等。

我有一種感覺,這個問題會通過廣播來回答,但我不知道如何去做這個。

+2

是否'np.multiply.outer(in_list,in_array)'給你需要什麼? –

+0

是的,這有效。你能否寫下這個答案,以便我能接受它? –

回答

3

你想要np.multiply.outerouter方法是爲任何NumPy「ufunc」定義的,包括乘法。這裏有一個演示:

In [1]: import numpy as np 

In [2]: in_list = [2, 4, 6] 

In [3]: in_array = np.random.rand(5, 5) 

In [4]: result = np.multiply.outer(in_list, in_array) 

In [5]: result.shape 
Out[5]: (3, 5, 5) 

In [6]: (result[1, :, :] == in_list[1] * in_array).all() 
Out[6]: True 

正如你提到的,廣播給出了另一種解決方案:如果轉換in_list長度3的一維NumPy的陣列,則可以重塑塑造(3, 1, 1)的數組,然後用乘法in_array將相應地播放:

In [9]: result2 = np.array(in_list)[:, None, None] * in_array 

In [10]: result2.shape 
Out[10]: (3, 5, 5) 

In [11]: (result2[1, :, :] == in_list[1] * in_array).all() 
Out[11]: True 
+0

謝謝!我使用500x500數組和100個元素的列表測試了兩個不同代碼中的%timeit。不同方法所用時間沒有顯着差異。 –