在 python 中展平/重塑 3D 阵列
flatten / reshape 3D array in python
我有一个大小为 (450,552,30) 的 3D 矢量,其中 450 = x 维度,552 = y 维度,30 = 时间步长。本质上,二维对象的延时。我知道有可能的 convLSTM 和 LSTM CNN,但我想将这些数据展平为一维 LSTM 模型以进行测试。
为了简化事情,让我们采用一个二维数组,这样
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
然后让我们将其与第 3 维连接几次:
a = np.expand_dims(a,axis=-1)
b = a
b = np.concatenate((b,a),axis=-1)
b = np.concatenate((b,a),axis=-1)
b = np.concatenate((b,a),axis=-1)
print(b.shape)
(3,3,4)
这样 b 就是相同的数据 (a),将其自身连接起来作为对我希望实现的全面数据的一种小规模练习。如果我这样做:
b.flatten()
array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9])
这没有给我想要的答案。我正在寻找更多:
array([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4], ..., [9,9,9,9]])
满量程输出的尺寸应为 (450 * 552, 30)。而不是 (450 * 552 * 30,)。有没有一种优雅的方式来做到这一点?
尝试:
cv2.merge([a,a,a,a])
输出:
array([[[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]],
[[4, 4, 4, 4],
[5, 5, 5, 5],
[6, 6, 6, 6]],
[[7, 7, 7, 7],
[8, 8, 8, 8],
[9, 9, 9, 9]]], dtype=int32)
In [63]: a = np.arange(1,10).reshape(3,3)
让我们做一个与列表的连接(stack
为我们做 expand_dims):
In [66]: b = np.stack([a,a,a,a],2)
In [67]: b.shape
Out[67]: (3, 3, 4)
In [68]: b.ravel()
Out[68]:
array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9])
In [69]: b.reshape(9,4)
Out[69]:
array([[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],
[4, 4, 4, 4],
[5, 5, 5, 5],
[6, 6, 6, 6],
[7, 7, 7, 7],
[8, 8, 8, 8],
[9, 9, 9, 9]])
或
In [71]: a1=a.reshape(9,1)
In [72]: np.concatenate([a1,a1,a1,a1],axis=1)
或
In [73]: np.repeat(a1,4,1)
如果您已经有了 (k,m,n) 数组,我猜最后这些是不相关的。您只需要简称 (reshape(k*m,n)
或 (-1, n)
。
我有一个大小为 (450,552,30) 的 3D 矢量,其中 450 = x 维度,552 = y 维度,30 = 时间步长。本质上,二维对象的延时。我知道有可能的 convLSTM 和 LSTM CNN,但我想将这些数据展平为一维 LSTM 模型以进行测试。
为了简化事情,让我们采用一个二维数组,这样
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
然后让我们将其与第 3 维连接几次:
a = np.expand_dims(a,axis=-1)
b = a
b = np.concatenate((b,a),axis=-1)
b = np.concatenate((b,a),axis=-1)
b = np.concatenate((b,a),axis=-1)
print(b.shape)
(3,3,4)
这样 b 就是相同的数据 (a),将其自身连接起来作为对我希望实现的全面数据的一种小规模练习。如果我这样做:
b.flatten()
array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9])
这没有给我想要的答案。我正在寻找更多:
array([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4], ..., [9,9,9,9]])
满量程输出的尺寸应为 (450 * 552, 30)。而不是 (450 * 552 * 30,)。有没有一种优雅的方式来做到这一点?
尝试:
cv2.merge([a,a,a,a])
输出:
array([[[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]],
[[4, 4, 4, 4],
[5, 5, 5, 5],
[6, 6, 6, 6]],
[[7, 7, 7, 7],
[8, 8, 8, 8],
[9, 9, 9, 9]]], dtype=int32)
In [63]: a = np.arange(1,10).reshape(3,3)
让我们做一个与列表的连接(stack
为我们做 expand_dims):
In [66]: b = np.stack([a,a,a,a],2)
In [67]: b.shape
Out[67]: (3, 3, 4)
In [68]: b.ravel()
Out[68]:
array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9])
In [69]: b.reshape(9,4)
Out[69]:
array([[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],
[4, 4, 4, 4],
[5, 5, 5, 5],
[6, 6, 6, 6],
[7, 7, 7, 7],
[8, 8, 8, 8],
[9, 9, 9, 9]])
或
In [71]: a1=a.reshape(9,1)
In [72]: np.concatenate([a1,a1,a1,a1],axis=1)
或
In [73]: np.repeat(a1,4,1)
如果您已经有了 (k,m,n) 数组,我猜最后这些是不相关的。您只需要简称 (reshape(k*m,n)
或 (-1, n)
。