Numpy 优化重塑:2D 阵列到 3D
Numpy optimized reshape : 2D array to 3D
我想知道是否有更多 pythonic/efficient 方法可以将 2 维数组重塑为 3 维数组?这是以下工作代码:
import numpy as np
#
# Declaring the dimensions
n_ddl = 2
N = 3
n_H = n_ddl*N
#
# Typical 2D array to reshape
x_tilde_2d = np.array([[111,112,121,122,131,132],[211,212,221,222,231,232],[311,312,321,322,331,332]])
x_tilde_2d = x_tilde_2d.T
#
# Initialization of the output 3D array
x_tilde_reshaped_3d = np.zeros((N,x_tilde_2d.shape[1],n_ddl))
for i in range(0,x_tilde_2d.shape[1],1):
x_tilde_sol = x_tilde_2d[:,i]
x_tilde_sol_reshape = x_tilde_sol.reshape((N,n_ddl))
for j in range(0,n_ddl,1):
x_tilde_reshaped_3d[:,i,j] = x_tilde_sol_reshape[:,j]
这是原始的预期输出:
array([[[111., 112.],
[211., 212.],
[311., 312.]],
[[121., 122.],
[221., 222.],
[321., 322.]],
[[131., 132.],
[231., 232.],
[331., 332.]]])
和相同的输出,沿轴 = 2 :
x_tilde_reshaped_3d[:,:,0] = np.array([[111., 211., 311.],
[121., 221., 321.],
[131., 231., 331.]])
x_tilde_reshaped_3d[:,:,1] = np.array([[112., 212., 312.],
[122., 222., 322.],
[132., 232., 332.]])
如有任何建议,我们将不胜感激。谢谢
为什么不直接做一个 reshape
。似乎没有必要首先初始化一个零的 3d 矩阵,然后按维度填充它们。
可以通过使用 swapaxes(0, 1)
交换第一轴和第二轴来实现所需的顺序
已编辑答案
x_tilde_2d = np.array([[111,112,121,122,131,132],[211,212,221,222,231,232],[311,312,321,322,331,332]])
x_tilde_reshaped_3d = x_tilde_2d.reshape(N, x_tilde_2d.T.shape[1], n_ddl).swapaxes(0, 1)
print (x_tilde_reshaped_3d)
输出
[[[111 112]
[211 212]
[311 312]]
[[121 122]
[221 222]
[321 322]]
[[131 132]
[231 232]
[331 332]]]
In [337]: x=np.array([[111,112,121,122,131,132],[211,212,221,222,231,232],[311,3
...: 12,321,322,331,332]])
In [338]: x.shape
Out[338]: (3, 6)
In [339]: x
Out[339]:
array([[111, 112, 121, 122, 131, 132],
[211, 212, 221, 222, 231, 232],
[311, 312, 321, 322, 331, 332]])
使最后一个维度保持正确顺序的唯一整形是:
In [340]: x.reshape(3,3,2)
Out[340]:
array([[[111, 112],
[121, 122],
[131, 132]],
[[211, 212],
[221, 222],
[231, 232]],
[[311, 312],
[321, 322],
[331, 332]]])
现在只需交换前两个维度:
In [341]: x.reshape(3,3,2).transpose(1,0,2)
Out[341]:
array([[[111, 112],
[211, 212],
[311, 312]],
[[121, 122],
[221, 222],
[321, 322]],
[[131, 132],
[231, 232],
[331, 332]]])
我想知道是否有更多 pythonic/efficient 方法可以将 2 维数组重塑为 3 维数组?这是以下工作代码:
import numpy as np
#
# Declaring the dimensions
n_ddl = 2
N = 3
n_H = n_ddl*N
#
# Typical 2D array to reshape
x_tilde_2d = np.array([[111,112,121,122,131,132],[211,212,221,222,231,232],[311,312,321,322,331,332]])
x_tilde_2d = x_tilde_2d.T
#
# Initialization of the output 3D array
x_tilde_reshaped_3d = np.zeros((N,x_tilde_2d.shape[1],n_ddl))
for i in range(0,x_tilde_2d.shape[1],1):
x_tilde_sol = x_tilde_2d[:,i]
x_tilde_sol_reshape = x_tilde_sol.reshape((N,n_ddl))
for j in range(0,n_ddl,1):
x_tilde_reshaped_3d[:,i,j] = x_tilde_sol_reshape[:,j]
这是原始的预期输出:
array([[[111., 112.],
[211., 212.],
[311., 312.]],
[[121., 122.],
[221., 222.],
[321., 322.]],
[[131., 132.],
[231., 232.],
[331., 332.]]])
和相同的输出,沿轴 = 2 :
x_tilde_reshaped_3d[:,:,0] = np.array([[111., 211., 311.],
[121., 221., 321.],
[131., 231., 331.]])
x_tilde_reshaped_3d[:,:,1] = np.array([[112., 212., 312.],
[122., 222., 322.],
[132., 232., 332.]])
如有任何建议,我们将不胜感激。谢谢
为什么不直接做一个 reshape
。似乎没有必要首先初始化一个零的 3d 矩阵,然后按维度填充它们。
可以通过使用 swapaxes(0, 1)
已编辑答案
x_tilde_2d = np.array([[111,112,121,122,131,132],[211,212,221,222,231,232],[311,312,321,322,331,332]])
x_tilde_reshaped_3d = x_tilde_2d.reshape(N, x_tilde_2d.T.shape[1], n_ddl).swapaxes(0, 1)
print (x_tilde_reshaped_3d)
输出
[[[111 112]
[211 212]
[311 312]]
[[121 122]
[221 222]
[321 322]]
[[131 132]
[231 232]
[331 332]]]
In [337]: x=np.array([[111,112,121,122,131,132],[211,212,221,222,231,232],[311,3
...: 12,321,322,331,332]])
In [338]: x.shape
Out[338]: (3, 6)
In [339]: x
Out[339]:
array([[111, 112, 121, 122, 131, 132],
[211, 212, 221, 222, 231, 232],
[311, 312, 321, 322, 331, 332]])
使最后一个维度保持正确顺序的唯一整形是:
In [340]: x.reshape(3,3,2)
Out[340]:
array([[[111, 112],
[121, 122],
[131, 132]],
[[211, 212],
[221, 222],
[231, 232]],
[[311, 312],
[321, 322],
[331, 332]]])
现在只需交换前两个维度:
In [341]: x.reshape(3,3,2).transpose(1,0,2)
Out[341]:
array([[[111, 112],
[211, 212],
[311, 312]],
[[121, 122],
[221, 222],
[321, 322]],
[[131, 132],
[231, 232],
[331, 332]]])