2017-09-21 19 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。不同方法所用时间没有显着差异。 –