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

Apply a 1D array to every cell of a 2D array to create a 3D array

在 Numpy 中给定一个二维数组和一个一维数组:

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 循环)以提高速度?

一个解决方案是

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

你想要outer减法

>>> np.subtract.outer(a,b)

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

       [[ 2,  0, -2],
        [ 3,  1, -1],
        [ 4,  2,  0]]])