我正在尝试使用 0 到 5 的新值对值从 0 到 15 的数组重新分类。
我的条件如下:
con1 = np.in1d(arr, [0, 11, 13, 15]).reshape((y, x)) # new val 0
con2 = np.in1d(arr, [1, 2, 3, 4, 5]).reshape((y, x)) # new val 1
con3 = (arr == 6) | (arr == 7) # new val 2
con4 = (arr == 8) | (arr == 9) # new val 3
con5 = (arr == 10) # new val 4
con6 = (arr == 12) | (arr == 14) # new val 5
我在 python 中有以下行
return np.where(con1, 0, np.where(con2, 1, np.where(con3, 2, np.where(con4, 3, np.where(con5, 4, np.where(con6, 5, arr))))))
长度为 128 个字符(包括函数内的缩进)。 PEP8 建议行不应超过 79 个字符。但是,我不确定在保持可读性的同时将这一行分成多行的最佳方法是什么。
我尝试了两个选项,但它们似乎难以阅读。
选项 1:
return np.where(con1, 0, np.where(
con2, 1, np.where(
con3, 2, np.where(
con4, 3, np.where(
con5, 4, np.where(
con6, 5, arr))))))
选项 2:
return np.where(con1, 0,
np.where(con2, 1,
np.where(con3, 2,
np.where(con4, 3,
np.where(con5, 4,
np.where(con6, 5, arr)
)))))
请您参考如下方法:
您可以单独完成它们。这更具可读性,因为您可以逐步执行。
filtered_result = np.where(con6, 5, arr)
filtered_result = np.where(con5, 4, filtered_result)
filtered_result = np.where(con4, 3, filtered_result)
filtered_result = np.where(con3, 2, filtered_result)
filtered_result = np.where(con2, 1, filtered_result)
filtered_result = np.where(con1, 0, filtered_result)
return filtered_result
要坚持使用 pep8,这就是您所要求的,那么这就是要走的路
编辑
for 循环也会显着减少重复性并且仍然可读。
connections = iter((con6, con5, con4, con3, co2, con1, con0))
filters = range(len(connections)-2, 0 -1)
filtered_result = np.where(next(connections), next(filters), arr)
for n, con, in zip(filters, connections):
filtered_result = np.where(con, n, filtered_result)
return filtered_result
