web-dev-qa-db-ja.com

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構文でこれを達成するための賢い方法はありますか?

ありがとうございました

17
slashdottir

このソリューションは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のままです。

29
bbayles
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]

「ファンシーインデックス」の詳細については、 ドキュメント を参照してください。

4
Alex Szatmary