Numpy:从 4 个 (x,y) 数组创建一个 (x,y,2,2) 数组
Numpy: Creating an (x,y,2,2) array from 4 (x,y) arrays
我在广播方面遇到问题。如果可能的话,我希望能够在没有 for 循环的情况下将形状为 x、y 的 4 个不同数组的元素分配给 2x2 矩阵。
a = np.arange(6).reshape(2,3)
b = np.arange(6,12).reshape(2,3)
c = np.arange(12,18).reshape(2,3)
d = np.arange(18,24).reshape(2,3)
x = np.array([[a, b], [c, d]])
显然这是行不通的,但我希望 x 得出一个数组:
[ [
[[0,6], [12, 18]],
[[1, 7], [13, 19]],
[[2, 8], [14, 20]],
],
[
[[3, 9], [15, 21]],
[[4, 10], [16, 22]],
[[5, 11], [17, 23]]
]
]
最简单的方法:在x =np.array([[a, b], [c, d]])
之后定义
y=np.rollaxis(np.rollaxis(x,-1),-1)
。这是 x 上的一个视图,因此没有完成任何复制。
另一种方法:自己创建新维度:
ac =np.concatenate((a[:,:,np.newaxis],c[:,:,np.newaxis]),axis=-1)
bd =np.concatenate((b[:,:,np.newaxis],d[:,:,np.newaxis]),axis=-1)
abcd =np.concatenate((ac[:,:,:,np.newaxis],bd[:,:,:,np.newaxis]),axis=-1)
然后
In [3]: abcd
Out[3]: array([[[[ 0, 6],
[12, 18]],
[[ 1, 7],
[13, 19]],
[[ 2, 8],
[14, 20]]],
[[[ 3, 9],
[15, 21]],
[[ 4, 10],
[16, 22]],
[[ 5, 11],
[17, 23]]]])
这似乎是一种边缘情况,您最好的选择是构建数组然后手动填充它:
a = np.arange(6).reshape(2,3)
b = np.arange(6,12).reshape(2,3)
c = np.arange(12,18).reshape(2,3)
d = np.arange(18,24).reshape(2,3)
out = np.zeros(a.shape + (2,2))
out[..., 0, 0] = a
out[..., 0, 1] = b
out[..., 1, 0] = c
out[..., 1, 1] = d
>>> out
array([[[[ 0., 6.],
[ 12., 18.]],
[[ 1., 7.],
[ 13., 19.]],
[[ 2., 8.],
[ 14., 20.]]],
[[[ 3., 9.],
[ 15., 21.]],
[[ 4., 10.],
[ 16., 22.]],
[[ 5., 11.],
[ 17., 23.]]]])
这是 np.dstack
和 reshaping
-
的一种方式
np.dstack((a,b,c,d)).reshape(a.shape + (2,2,))
样本运行-
输入:
In [32]: a
Out[32]:
array([[0, 1, 2],
[3, 4, 5]])
In [33]: b
Out[33]:
array([[ 6, 7, 8],
[ 9, 10, 11]])
In [34]: c
Out[34]:
array([[12, 13, 14],
[15, 16, 17]])
In [35]: d
Out[35]:
array([[18, 19, 20],
[21, 22, 23]])
输出:
In [36]: np.dstack((a,b,c,d)).reshape(a.shape + (2,2,))
Out[36]:
array([[[[ 0, 6],
[12, 18]],
[[ 1, 7],
[13, 19]],
[[ 2, 8],
[14, 20]]],
[[[ 3, 9],
[15, 21]],
[[ 4, 10],
[16, 22]],
[[ 5, 11],
[17, 23]]]])
我在广播方面遇到问题。如果可能的话,我希望能够在没有 for 循环的情况下将形状为 x、y 的 4 个不同数组的元素分配给 2x2 矩阵。
a = np.arange(6).reshape(2,3)
b = np.arange(6,12).reshape(2,3)
c = np.arange(12,18).reshape(2,3)
d = np.arange(18,24).reshape(2,3)
x = np.array([[a, b], [c, d]])
显然这是行不通的,但我希望 x 得出一个数组:
[ [
[[0,6], [12, 18]],
[[1, 7], [13, 19]],
[[2, 8], [14, 20]],
],
[
[[3, 9], [15, 21]],
[[4, 10], [16, 22]],
[[5, 11], [17, 23]]
]
]
最简单的方法:在x =np.array([[a, b], [c, d]])
之后定义
y=np.rollaxis(np.rollaxis(x,-1),-1)
。这是 x 上的一个视图,因此没有完成任何复制。
另一种方法:自己创建新维度:
ac =np.concatenate((a[:,:,np.newaxis],c[:,:,np.newaxis]),axis=-1)
bd =np.concatenate((b[:,:,np.newaxis],d[:,:,np.newaxis]),axis=-1)
abcd =np.concatenate((ac[:,:,:,np.newaxis],bd[:,:,:,np.newaxis]),axis=-1)
然后
In [3]: abcd
Out[3]: array([[[[ 0, 6],
[12, 18]],
[[ 1, 7],
[13, 19]],
[[ 2, 8],
[14, 20]]],
[[[ 3, 9],
[15, 21]],
[[ 4, 10],
[16, 22]],
[[ 5, 11],
[17, 23]]]])
这似乎是一种边缘情况,您最好的选择是构建数组然后手动填充它:
a = np.arange(6).reshape(2,3)
b = np.arange(6,12).reshape(2,3)
c = np.arange(12,18).reshape(2,3)
d = np.arange(18,24).reshape(2,3)
out = np.zeros(a.shape + (2,2))
out[..., 0, 0] = a
out[..., 0, 1] = b
out[..., 1, 0] = c
out[..., 1, 1] = d
>>> out
array([[[[ 0., 6.],
[ 12., 18.]],
[[ 1., 7.],
[ 13., 19.]],
[[ 2., 8.],
[ 14., 20.]]],
[[[ 3., 9.],
[ 15., 21.]],
[[ 4., 10.],
[ 16., 22.]],
[[ 5., 11.],
[ 17., 23.]]]])
这是 np.dstack
和 reshaping
-
np.dstack((a,b,c,d)).reshape(a.shape + (2,2,))
样本运行-
输入:
In [32]: a
Out[32]:
array([[0, 1, 2],
[3, 4, 5]])
In [33]: b
Out[33]:
array([[ 6, 7, 8],
[ 9, 10, 11]])
In [34]: c
Out[34]:
array([[12, 13, 14],
[15, 16, 17]])
In [35]: d
Out[35]:
array([[18, 19, 20],
[21, 22, 23]])
输出:
In [36]: np.dstack((a,b,c,d)).reshape(a.shape + (2,2,))
Out[36]:
array([[[[ 0, 6],
[12, 18]],
[[ 1, 7],
[13, 19]],
[[ 2, 8],
[14, 20]]],
[[[ 3, 9],
[15, 21]],
[[ 4, 10],
[16, 22]],
[[ 5, 11],
[17, 23]]]])