【发布时间】:2020-06-16 02:08:11
【问题描述】:
我有一个 2D numpy [n x m] 数组,我想为其计算每 n 行的中位数,但只计算每行的非零值。我想使用 numpy 而不使用 for 循环来做到这一点。到目前为止,我知道我必须使用
median_array = np.median(data, axis=1)
但是,要计算每行的中位数,在计算中位数时如何有效地掩盖每行中的零值?
【问题讨论】:
我有一个 2D numpy [n x m] 数组,我想为其计算每 n 行的中位数,但只计算每行的非零值。我想使用 numpy 而不使用 for 循环来做到这一点。到目前为止,我知道我必须使用
median_array = np.median(data, axis=1)
但是,要计算每行的中位数,在计算中位数时如何有效地掩盖每行中的零值?
【问题讨论】:
import numpy as np
np.ma.median(np.ma.masked_equal(data,0),axis=1).data
>>> a =np.hstack(( np.arange(10),np.array([0,1,0,1,0]))).reshape(3,5)
>>> a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[0, 1, 0, 1, 0]])
>>> np.ma.median(np.ma.masked_equal(a,0),axis=1).data
array([2.5, 7. , 1. ])
【讨论】:
axis=1 参数来匹配 OP 的所需输出。
您应该接受@Sarthak 的回答,它涵盖了它 - 只是想补充一点,人们应该在此处避免使用np.median 并提供另一个示例:
import numpy as np
a = np.array([[1, 2, 3, 0], [4, 4, 0, 0], [0, 0, 0, 0]])
print(a)
print(np.median(a, axis=1))
# this answers the question:
print(np.ma.masked_equal(a, 0))
print(np.ma.median(np.ma.masked_equal(a, 0), axis=1))
# you can't just use np.median
import warnings
warnings.filterwarnings('error')
try:
print(np.median(np.ma.masked_equal(a, 0), axis=1))
except Warning as w:
print(w)
结果:
[[1 2 3 0]
[4 4 0 0]
[0 0 0 0]]
[1.5 2. 0. ]
[[1 2 3 --]
[4 4 -- --]
[-- -- -- --]]
[2.0 4.0 --]
Warning: 'partition' will ignore the 'mask' of the MaskedArray.
【讨论】: