【问题标题】:Row-by-row Median of non-zero values of 2D array二维数组非零值的逐行中位数
【发布时间】:2020-06-16 02:08:11
【问题描述】:

我有一个 2D numpy [n x m] 数组,我想为其计算每 n 行的中位数,但只计算每行的非零值。我想使用 numpy 而不使用 for 循环来做到这一点。到目前为止,我知道我必须使用

median_array = np.median(data, axis=1)

但是,要计算每行的中位数,在计算中位数时如何有效地掩盖每行中的零值?

【问题讨论】:

标签: python arrays numpy


【解决方案1】:

使用masked array

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 的所需输出。
【解决方案2】:

您应该接受@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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2018-08-05
    • 2021-02-04
    • 2019-01-18
    • 1970-01-01
    • 2012-06-26
    • 2015-03-13
    相关资源
    最近更新 更多