Skip to main content
 首页 » 编程设计

python之分割这条线的最pythonic方式

2025年05月04日19傻小

我正在尝试使用 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