迭代 4d 和 3d 数组并再次返回 4d 形状的值

Posted

技术标签:

【中文标题】迭代 4d 和 3d 数组并再次返回 4d 形状的值【英文标题】:Iterate over 4d and 3d array and return the values in the shape of 4d again 【发布时间】:2021-09-27 01:57:22 【问题描述】:

我有一个名为first_channel 的形状为(10, 100, 32, 64)4D 数组。然后,我遍历第一个维度中的 10 个元素中的每一个,并获取形状为 (100, 32, 64) 的结果 3D 数组。我遍历第一维的 100 个元素中的每一个,进行最小-最大缩放并在缩放形状为 (32, 64) 的 2D 子数组后返回到 4D 数组的形状。

for record_num, record in enumerate(first_channel):
    for frame_num, frame in enumerate(record):
        data_min = np.min(frame)
        data_max = np.max(frame)
        normalized_data = (frame - data_min) / (data_max - data_min)

我尝试了这种方法,但问题是一天结束时列表的长度是 1000,所以我看到它正在将 10 条记录中的每一条与 100 帧结合起来。但是,我需要对 100 帧中的每一帧进行最小-最大缩放,并以(100, 32, 64) 的形状返回值,然后以4D 的形状将其返回为 (10, 100, 32, 64)`。

【问题讨论】:

您有一个双循环,但在内循环中只有一个附加。因此,根据基本列表逻辑,结果是一个列表。您想要一个列表列表,这需要 2 级列表追加。用一些小东西来练习,以获得更清晰的想法。 【参考方案1】:

您可以直接计算所有数量,无需重新调整任何内容:

mn = first_channel.min(axis=(2, 3), keepdims=True)
mx = first_channel.max(axis=(2, 3), keepdims=True)
first_channel -= mn
first_channel /= mx - mn

这会就地执行操作,这对于足够大的数组可能是您想要的。请记住,这将在没有动态范围的通道上遇到问题,因为mx - mn 将为零,并且是第二步中的除数。

【讨论】:

我认为轴应该是 (2, 3) 而不是 (3,4) @Atila。你是绝对正确的。谢谢你的收获。固定【参考方案2】:

我会这样做:

import numpy as np

np.random.seed(0)
data = np.random.randint(10, size = (3, 3, 3, 3))

normalized_data = (data - data.min((2, 3)).reshape(3, 3, 1, 1))/(data.max((2, 3)) - data.min((2, 3))).reshape(3, 3, 1, 1)

输出:

data = 
[[[[5 0 3]
   [3 7 9]
   [3 5 2]]

  [[4 7 6]
   [8 8 1]
   [6 7 7]]

  [[8 1 5]
   [9 8 9]
   [4 3 0]]]


 [[[3 5 0]
   [2 3 8]
   [1 3 3]]

  [[3 7 0]
   [1 9 9]
   [0 4 7]]

  [[3 2 7]
   [2 0 0]
   [4 5 5]]]


 [[[6 8 4]
   [1 4 9]
   [8 1 1]]

  [[7 9 9]
   [3 6 7]
   [2 0 3]]

  [[5 9 4]
   [4 6 4]
   [4 3 4]]]]
normalized_data = 
[[[[0.55555556 0.         0.33333333]
   [0.33333333 0.77777778 1.        ]
   [0.33333333 0.55555556 0.22222222]]

  [[0.42857143 0.85714286 0.71428571]
   [1.         1.         0.        ]
   [0.71428571 0.85714286 0.85714286]]

  [[0.88888889 0.11111111 0.55555556]
   [1.         0.88888889 1.        ]
   [0.44444444 0.33333333 0.        ]]]


 [[[0.375      0.625      0.        ]
   [0.25       0.375      1.        ]
   [0.125      0.375      0.375     ]]

  [[0.33333333 0.77777778 0.        ]
   [0.11111111 1.         1.        ]
   [0.         0.44444444 0.77777778]]

  [[0.42857143 0.28571429 1.        ]
   [0.28571429 0.         0.        ]
   [0.57142857 0.71428571 0.71428571]]]


 [[[0.625      0.875      0.375     ]
   [0.         0.375      1.        ]
   [0.875      0.         0.        ]]

  [[0.77777778 1.         1.        ]
   [0.33333333 0.66666667 0.77777778]
   [0.22222222 0.         0.33333333]]

  [[0.33333333 1.         0.16666667]
   [0.16666667 0.5        0.16666667]
   [0.16666667 0.         0.16666667]]]]

【讨论】:

以上是关于迭代 4d 和 3d 数组并再次返回 4d 形状的值的主要内容,如果未能解决你的问题,请参考以下文章

迭代地将矩阵插入/附加到矩阵中

如何声明可以在整个程序中使用的全局 2d 3d 4d ...数组(堆版本)变量?

4D转3D透视投影

将 numpy 数组转换为 4D nifti 文件

如何规范化 4D numpy 数组?

C4D做的3D文字模型在画图3D和PPT里加载问题