【问题标题】:replace zeroes in numpy array with the median value用中值替换numpy数组中的零
【发布时间】:2013-06-08 00:34:25
【问题描述】:

我有一个这样的 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 语法实现这一点?

谢谢

【问题讨论】:

    标签: python arrays numpy replace conditional-statements


    【解决方案1】:

    此解决方案利用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。

    【讨论】:

      【解决方案2】:
      foo2 = foo[:]
      foo2[foo2 == 0] = nz_values[middle]
      

      如果需要,您可以直接更新 foo,而不是 foo2。 Numpy 的智能数组语法可以结合您编写的几行代码。例如,而不是,

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

      你可以这样做

      nz_values = foo[foo > 0]
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-02
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 2019-09-26
        • 2012-05-07
        • 1970-01-01
        • 2011-03-25
        相关资源
        最近更新 更多