将double替换为numpy数组上的循环(带有对其他数组的索引)



下面是我正在处理的示例:

processed_data = np.empty_like(data)
min_per_col = np.amin(data, axis=0) # axis0 for col, axis1 for row
max_per_col = np.amax(data, axis=0) # axis0 for col, axis1 for row
for row_idx, row in enumerate(data):
for col_idx, val in enumerate(row):
processed_data[row_idx][col_idx] = (val - min_per_col[col_idx]) / (max_per_col[col_idx] - min_per_col[col_idx])

CCD_ 1被定义为2d numpy数组。我本质上是在尝试使用min_per_colmax_per_col中的相关值对data中的每个元素执行一些操作。

我似乎想不出该怎么办。从这些帖子来看,答案似乎是重塑阵列,使广播发挥作用。

直觉上,我认为它与广播的工作方式是:

# Results of min_per_col: 
#     [min1 min2 min3 min4 min5]
# Transformation to (call this 2d_min_per_col):
#     [[min1 min2 min3 min4 min5],
#      [min1 min2 min3 min4 min5],
#      [min1 min2 min3 min4 min5]
#      ...
#      [min1 min2 min3 min4 min5]]
# which basically duplicates min_per_col into a 2d array form.
# Do the same for max (2d_max_per_col)
# processed_data = (data - 2d_min_per_col) / (2d_max_per_col - 2d_min_per_col)

这种方法有意义吗?或者,对于如何处理这样的事情,还有其他答案吗?

请让我知道,如果有任何其他有助于包括在这个帖子!非常感谢。

编辑:感谢疯狂物理学家的帮助!尝试过之后:

processed_data = np.empty_like(data)
min_per_col = np.amin(data, axis=0) # axis0 for col, axis1 for row
max_per_col = np.amax(data, axis=0) # axis0 for col, axis1 for row
for row_idx, row in enumerate(data):
for col_idx, val in enumerate(row):
processed_data[row_idx, col_idx] = (val - min_per_col[col_idx]) / (max_per_col[col_idx] - min_per_col[col_idx])
print("version 1n", processed_data)
processed_data = (data - min_per_col) / (max_per_col - min_per_col)
print("version 2n", processed_data)
return processed_data

它的工作原理相同,而且速度更快!

version 1
[[0.25333333 0.13793103 0.14285714]
[0.32       0.79310345 0.92857143]
[0.13333333 0.48275862 0.51785714]
...
[0.28       0.4137931  0.125     ]
[0.01333333 0.24137931 0.75      ]
[0.08       0.20689655 0.23214286]]
version 2
[[0.25333333 0.13793103 0.14285714]
[0.32       0.79310345 0.92857143]
[0.13333333 0.48275862 0.51785714]
...
[0.28       0.4137931  0.125     ]
[0.01333333 0.24137931 0.75      ]
[0.08       0.20689655 0.23214286]]

感谢您的快速帮助:D

你已经掌握了它的要点,但广播的全部意义在于,你不需要扩展数组来对它们进行操作:形状在右边排列。举个例子,假设data.shape就是(M, N),你的数组形状在数学运算中是这样的:

data:           (M, N)
processed_data: (M, N)
min_per_col:       (N,)
max_per_col:       (N,)

请注意,min_per_colmax_per_col完美地排列在一起。这意味着你的整个循环变成了简单的

processed_data = (data - min_per_col) / (max_per_col - min_per_col)
#                    (M, N)                         (N,)
#                                   (M, N)

每个操作符下面的注释显示广播输出的形状。

顺便说一句,您可以使用np.ptp:在一步中计算分母

processed_data = (data - np.min(data, axis=0)) / np.ptp(data, axis=0)

最新更新