遍历 4d 和 3d 数组并再次 return 4d 形状的值
Iterate over 4d and 3d array and return the values in the shape of 4d again
我有一个形状为 (10, 100, 32, 64)
的 4D
数组,名为 first_channel
。然后,我遍历第一维中的 10 个元素中的每一个,并获取形状为 (100, 32, 64)
的结果 3D 数组。我遍历第一维的 100 个元素中的每一个,进行最小-最大缩放,然后 return 在缩放形状为 (32, 64)
.[= 的 2D 子数组后返回到 4D 数组的形状。 19=]
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)
的形状获得 returned 的值,然后 return 它的形状4D
作为 (10, 100, 32, 64)`。
我会这样做:
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]]]]
您可以直接计算所有数量,无需重塑任何东西:
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
将为零,并且是第二步中的除数。
我有一个形状为 (10, 100, 32, 64)
的 4D
数组,名为 first_channel
。然后,我遍历第一维中的 10 个元素中的每一个,并获取形状为 (100, 32, 64)
的结果 3D 数组。我遍历第一维的 100 个元素中的每一个,进行最小-最大缩放,然后 return 在缩放形状为 (32, 64)
.[= 的 2D 子数组后返回到 4D 数组的形状。 19=]
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)
的形状获得 returned 的值,然后 return 它的形状4D
作为 (10, 100, 32, 64)`。
我会这样做:
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]]]]
您可以直接计算所有数量,无需重塑任何东西:
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
将为零,并且是第二步中的除数。