如何将3D矩阵分割成列表中排列的3D矩阵?

时间:2018-01-11 18:32:33

标签: python numpy scipy

我有一个NumPy数组,其形状如下:

(1532, 2036, 5)

我想生成一个数组列表,其中每个数组都有以下形状:

(1532, 2036)

3 个答案:

答案 0 :(得分:3)

您可以使用Ellipsis表示截至最后的所有尺寸。例如:

arr = np.random.rand(4, 3, 2)
arr
array([[[ 0.35235813,  0.57984153],
        [ 0.53743048,  0.46753367],
        [ 0.80048303,  0.07982378]],

       [[ 0.1339381 ,  0.84586721],
        [ 0.81425027,  0.41086151],
        [ 0.34039991,  0.19972737]],

       [[ 0.2112466 ,  0.73086434],
        [ 0.03755819,  0.40113463],
        [ 0.74622891,  0.74695994]],

       [[ 0.99313615,  0.65634951],
        [ 0.90787642,  0.37387861],
        [ 0.8738962 ,  0.41747727]]])

最后一个维度数组的列表可以构造为提到的@Usernamenotfound,也可以构造为Ellipsis,如下所示:

[arr[..., i] for i in range(arr.shape[-1])]
[array([[ 0.35235813,  0.53743048,  0.80048303],
        [ 0.1339381 ,  0.81425027,  0.34039991],
        [ 0.2112466 ,  0.03755819,  0.74622891],
        [ 0.99313615,  0.90787642,  0.8738962 ]]),
 array([[ 0.57984153,  0.46753367,  0.07982378],
        [ 0.84586721,  0.41086151,  0.19972737],
        [ 0.73086434,  0.40113463,  0.74695994],
        [ 0.65634951,  0.37387861,  0.41747727]])]

每个元素的形状为(4, 3)

同样,对于第一个维度,你可以这样做,制作4(3)个数组。

[arr[i, ...] for i in range(arr.shape[0])]
[array([[ 0.35235813,  0.57984153],
        [ 0.53743048,  0.46753367],
        [ 0.80048303,  0.07982378]]), array([[ 0.1339381 ,  0.84586721],
        [ 0.81425027,  0.41086151],
        [ 0.34039991,  0.19972737]]), array([[ 0.2112466 ,  0.73086434],
        [ 0.03755819,  0.40113463],
        [ 0.74622891,  0.74695994]]), array([[ 0.99313615,  0.65634951],
        [ 0.90787642,  0.37387861],
        [ 0.8738962 ,  0.41747727]])]

答案 1 :(得分:1)

您还可以使用numpy.transpose对轴进行置换,然后只需遍历数组:

import numpy as np
a = ... # Define the input array here
out = [a for a in np.transpose(arr, (2, 0, 1))]

答案 2 :(得分:0)

您可以使用

切割3D数组
[x[:,:,i] for i in range(5)]

上面会给你一个2D数组列表。

可以为多维数组缩放相同的过程