Python Elif优化问题

时间:2019-08-20 08:12:41

标签: python arrays numpy if-statement

如何优化此代码?

如何尽可能短地优化此代码。我是初学者,请帮助我

退出条件:

  • arr必须是仅包含有效数字的有效2D数组。
  • 数据可以是:“列”或“行”
  • 值可以是:“最小”或“最大”或“平均值”或“中位数”
  • 数组必须是仅带整数/浮点数的有效2D数组
def get_math_value(array, data, value):
    if data == 'row' and value == 'min':
        arr = array
        min_row = list(map(min, arr))
        print(min_row)
    elif data == 'row' and value == 'max':
        arr = array
        max_row = list(map(min, arr))
        print(max_row)
    elif data == 'row' and value == 'mean':
        arr = array
        mean_row = np.mean(arr, axis=1)
        print(mean_row)
    elif data == 'row' and value == 'median':
        arr = array
        median_row = np.median(arr, axis=1)
        print(median_row)
    elif data == 'column' and value == 'min':
        arr = array
        min_column = list(map(min, zip(*arr)))
        print(min_column)
    elif data == 'column' and value == 'max':
        arr = array
        max_column = list(map(max, zip(*arr)))
        print(max_column)
    elif data == 'column' and value == 'mean':
        arr = array
        mean_column = np.mean(arr, axis=0)
        print(mean_column)
    elif data == 'column' and value == 'median':
        arr = array
        median_column = np.median(arr, axis=0)
        print(median_column)
    else:
        print('[]')

2 个答案:

答案 0 :(得分:4)

您也可以将np用于不使用它的分支,因此使用getattr来解决这个问题变得非常简单。您也不需要所有这些arr = array分配。

您的整个功能可以变成:

def get_math_value(array, data, value):
     # TODO maybe check explicitly for 'row'/'column', otherwise display an error
    axis = 1 if data == 'row' else 0
    try:
        print(list(getattr(np, value)(array, axis)))
    except AttributeError:
        print('[]')

然后

get_math_value([[1, 2, 3], [5, 4, 6]], 'row', 'min')
get_math_value([[1, 2, 3], [5, 4, 6]], 'row', 'max')
get_math_value([[1, 2, 3], [5, 4, 6]], 'column', 'min')
get_math_value([[1, 2, 3], [5, 4, 6]], 'row', 'median')
get_math_value([[1, 2, 3], [5, 4, 6]], 'row', 'non_existing_numpy_method')    

输出

[1, 4]
[3, 6]
[1, 2, 3]
[2.0, 5.0]
[]

答案 1 :(得分:1)

首先要知道的是numpy具有minmax函数,因此您不需要list(map(min, arr))调用,可以使用例如改为np.min(arr, axis=1)

考虑到这一点,您可以做类似的事情

def get_math_value(array, data, value):        
    axis = {'column': 0, 'row': 1}.get(data)
    func = {'mean': np.mean, 
            'median': np.median,
            'min': np.min, 
            'max': np.max}.get(value)
    if axis is None or func is None:
        print('[]')
    else:
        print(func(array, axis=axis))