遍历 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 将为零,并且是第二步中的除数。