如何优化此代码?
如何尽可能短地优化此代码。我是初学者,请帮助我
退出条件:
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('[]')
答案 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
具有min
和max
函数,因此您不需要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))