用中值替换numpy数组中的零

时间:2013-06-12 01:24:26

标签: python arrays numpy replace conditional-statements

我有一个像这样的numpy数组:

foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16]

我想用整个数组的中值替换所有零(其中零值不包括在中位数的计算中)

到目前为止,我还在继续:

foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16]
foo = np.array(foo_array)
foo = np.sort(foo)
print "foo sorted:",foo
#foo sorted: [ 0  0  0  0  0  3  5  8 14 15 16 17 18 19 21 26 27 29 29 31 38 38 40 49 55]
nonzero_values = foo[0::] > 0
nz_values = foo[nonzero_values]
print "nonzero_values?:",nz_values
#nonzero_values?: [ 3  5  8 14 15 16 17 18 19 21 26 27 29 29 31 38 38 40 49 55]
size = np.size(nz_values)
middle = size / 2
print "median is:",nz_values[middle]
#median is: 26

是否有一种聪明的方法可以通过numpy语法实现这一目标?

谢谢

2 个答案:

答案 0 :(得分:23)

此解决方案利用了numpy.median

import numpy as np
foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16]
foo = np.array(foo_array)
# Compute the median of the non-zero elements
m = np.median(foo[foo > 0])
# Assign the median to the zero elements 
foo[foo == 0] = m

请注意,你的数组的中位数(没有零)是23.5,但正如所写,这是23。

答案 1 :(得分:2)

foo2 = foo[:]
foo2[foo2 == 0] = nz_values[middle]

如果您愿意,可以只更新foo2,而不是foo。 Numpy的智能阵列语法可以组合您所制作的几行代码。例如,而不是

nonzero_values = foo[0::] > 0
nz_values = foo[nonzero_values]

你可以做到

nz_values = foo[foo > 0]

您可以在documentation中找到有关“花式索引”的更多信息。