在 Numpy 中将一维数组添加到三维数组
Adding a 1-D Array to a 3-D array in Numpy
我正在尝试添加两个数组。
np.zeros((6,9,20)) + np.array([1,2,3,4,5,6,7,8,9])
我想得到类似
的东西
array([[[ 1., 1., 1., ..., 1., 1., 1.],
[ 2., 2., 2., ..., 2., 2., 2.],
[ 3., 3., 3., ..., 3., 3., 3.],
...,
[ 7., 7., 7., ..., 7., 7., 7.],
[ 8., 8., 8., ..., 8., 8., 8.],
[ 9., 9., 9., ..., 9., 9., 9.]],
[[ 1., 1., 1., ..., 1., 1., 1.],
[ 2., 2., 2., ..., 2., 2., 2.],
[ 3., 3., 3., ..., 3., 3., 3.],
...,
[ 7., 7., 7., ..., 7., 7., 7.],
[ 8., 8., 8., ..., 8., 8., 8.],
[ 9., 9., 9., ..., 9., 9., 9.]],
所以在相应列的每个矩阵中添加条目。我知道我可以在某种循环中对其进行编码,但我正在尝试使用更优雅/更快的解决方案。
可以带broadcasting
into play after extending the dimensions of the second array with None
or np.newaxis
,像这样-
np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9])[None,:,None]
您可以使用 tile(但您还需要 swapaxes 以获得正确的形状)。
A = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
B = np.tile(A, (6, 20, 1))
C = np.swapaxes(B, 1, 2)
如果我没理解错的话,最好用的是NumPy's Broadcasting。您可以通过以下方式获得您想要的:
np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9]).reshape((1,9,1))
我更喜欢使用 reshape method 而不是像 Divakar 显示的那样对索引使用切片表示法,因为我已经做了很多工作将形状作为变量进行操作,并且传递元组更容易一些在变量中而不是切片中。您也可以这样做:
array1.reshape(array2.shape)
顺便说一下,如果您真的在寻找像沿轴从 0 到 N-1 的数组这样简单的东西,请查看 mgrid。您只需
即可获得上述输出
np.mgrid[0:6,1:10,0:20][1]
我正在尝试添加两个数组。
np.zeros((6,9,20)) + np.array([1,2,3,4,5,6,7,8,9])
我想得到类似
的东西array([[[ 1., 1., 1., ..., 1., 1., 1.],
[ 2., 2., 2., ..., 2., 2., 2.],
[ 3., 3., 3., ..., 3., 3., 3.],
...,
[ 7., 7., 7., ..., 7., 7., 7.],
[ 8., 8., 8., ..., 8., 8., 8.],
[ 9., 9., 9., ..., 9., 9., 9.]],
[[ 1., 1., 1., ..., 1., 1., 1.],
[ 2., 2., 2., ..., 2., 2., 2.],
[ 3., 3., 3., ..., 3., 3., 3.],
...,
[ 7., 7., 7., ..., 7., 7., 7.],
[ 8., 8., 8., ..., 8., 8., 8.],
[ 9., 9., 9., ..., 9., 9., 9.]],
所以在相应列的每个矩阵中添加条目。我知道我可以在某种循环中对其进行编码,但我正在尝试使用更优雅/更快的解决方案。
可以带broadcasting
into play after extending the dimensions of the second array with None
or np.newaxis
,像这样-
np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9])[None,:,None]
您可以使用 tile(但您还需要 swapaxes 以获得正确的形状)。
A = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
B = np.tile(A, (6, 20, 1))
C = np.swapaxes(B, 1, 2)
如果我没理解错的话,最好用的是NumPy's Broadcasting。您可以通过以下方式获得您想要的:
np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9]).reshape((1,9,1))
我更喜欢使用 reshape method 而不是像 Divakar 显示的那样对索引使用切片表示法,因为我已经做了很多工作将形状作为变量进行操作,并且传递元组更容易一些在变量中而不是切片中。您也可以这样做:
array1.reshape(array2.shape)
顺便说一下,如果您真的在寻找像沿轴从 0 到 N-1 的数组这样简单的东西,请查看 mgrid。您只需
即可获得上述输出np.mgrid[0:6,1:10,0:20][1]