将 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]]])
在 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]]])