将1D数组应用于2D数组的每个单元以创建3D数组

时间:2018-11-02 23:44:19

标签: python python-2.7 numpy vectorization numpy-broadcasting

在Numpy中给出2D数组和1D数组:

a = np.array([[1,2,3],[4,5,6]])
b = np.array([2,4,6])

我想减去a-b,而不是得到:

Out[16]: 
array([[-1, -2, -3],
   [ 2,  1,  0]])

我想要这个:

array([[[-1, -3, -5], [0, -2, -4], [1, -1, -3]],
       [[2, 0, -2], [3, 1, -1], [4, 2, 0]]])

如何进行矢量化处理(即没有for循环)以提高速度?

2 个答案:

答案 0 :(得分:2)

一种解决方案是

a[...,np.newaxis]-b 

这只是一个广播技巧。

而不是减去

>>> a
array([[1, 2, 3],
       [4, 5, 6]])

您来自

>>> a[...,np.newaxis]
array([[[1],
        [2],
        [3]],

       [[4],
        [5],
        [6]]])

具有形状

>>> a[...,np.newaxis].shape
(2, 3, 1)

b具有形状

>>> b.shape
(3,)

因此,广播规则将根据您的需要为您提供形状为(2,3,3)的输出。关于广播here的信息很好。

答案 1 :(得分:2)

您要减去outer

Person