迭代 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 形状的值的主要内容,如果未能解决你的问题,请参考以下文章