Python 在对数组的列取中值时,如何忽略零?

Python 在对数组的列取中值时,如何忽略零?,python,arrays,numpy,zero,median,Python,Arrays,Numpy,Zero,Median,我有一个简单的numpy数组 array([[10, 0, 10, 0], [ 1, 1, 0, 0] [ 9, 9, 9, 0] [ 0, 10, 1, 0]]) 我想分别取这个数组中每列的中位数 但是,在计算中间值时,我希望在各个位置忽略一些0值 更复杂的是,我想将只有0条目的列保留为中位数0。通过这种方式,这些列将充当一个占位符,保持矩阵的尺寸不变 numpy文档中没有任何可以满足我需要的参数(也许我被我们使用

我有一个简单的numpy数组

array([[10,   0,  10,  0],
       [ 1,   1,   0,  0]
       [ 9,   9,   9,  0]
       [ 0,  10,   1,  0]])
我想分别取这个数组中每列的中位数

但是,在计算中间值时,我希望在各个位置忽略一些
0

更复杂的是,我想将只有
0
条目的列保留为中位数
0
。通过这种方式,这些列将充当一个占位符,保持矩阵的尺寸不变

numpy文档中没有任何可以满足我需要的参数(也许我被我们使用R获得的许多开关宠坏了!)

numpy.median(a,axis=None,out=None,overwrite\u input=False)[source]

有人能告诉我们一个有效的方法吗?这符合numpy的精神?我可以破解它,但在这种情况下,我觉得我已经击败了使用numpy的初衷


提前谢谢。

这可能会有所帮助。获得非零数组后,可以直接从[nonzero(a)]

numpy.nonzero(a)[来源]

你可以用


使用遮罩数组和
np.ma.median(axis=0).filled(0)
获取列的中间值

In [1]: x = np.array([[10, 0, 10, 0], [1, 1, 0, 0], [9, 9, 9, 0], [0, 10, 1, 0]])
In [2]: y = np.ma.masked_where(x == 0, x)
In [3]: x
Out[3]: 
array([[10,  0, 10, 0],
       [ 1,  1,  0, 0],
       [ 9,  9,  9, 0],
       [ 0, 10,  1, 0]])
In [4]: y
Out[4]: 
masked_array(data =
 [[10 -- 10 --]
 [1 1 -- --]
 [9 9 9 --]
 [-- 10 1 --]],
             mask =
 [[False  True False True]
 [False False  True True]
 [False False False True]
 [ True False False True]],
       fill_value = 999999)
In [6]: np.median(x, axis=0)
Out[6]: array([ 5.,  5.,  5., 0.])
In [7]: np.ma.median(y, axis=0).filled(0)
Out[7]: 
array(data = [ 9.  9.  9., 0.])

屏蔽数组
总是很方便,但很慢:

In [14]:

%timeit np.ma.median(y, axis=0).filled(0)
1000 loops, best of 3: 1.73 ms per loop
In [15]:

%%timeit
ans=np.apply_along_axis(lambda v: np.median(v[v!=0]), 0, x)
ans[np.isnan(ans)]=0.
1000 loops, best of 3: 402 µs per loop

In [16]:

ans=np.apply_along_axis(lambda v: np.median(v[v!=0]), 0, x)
ans[np.isnan(ans)]=0.; ans
Out[16]:
array([ 9.,  9.,  9.,  0.])
np.非零
更快:

In [25]:

%%timeit
ans=np.apply_along_axis(lambda v: np.median(v[np.nonzero(v)]), 0, x)
ans[np.isnan(ans)]=0.
1000 loops, best of 3: 384 µs per loop
In [14]:

%timeit np.ma.median(y, axis=0).filled(0)
1000 loops, best of 3: 1.73 ms per loop
In [15]:

%%timeit
ans=np.apply_along_axis(lambda v: np.median(v[v!=0]), 0, x)
ans[np.isnan(ans)]=0.
1000 loops, best of 3: 402 µs per loop

In [16]:

ans=np.apply_along_axis(lambda v: np.median(v[v!=0]), 0, x)
ans[np.isnan(ans)]=0.; ans
Out[16]:
array([ 9.,  9.,  9.,  0.])
In [25]:

%%timeit
ans=np.apply_along_axis(lambda v: np.median(v[np.nonzero(v)]), 0, x)
ans[np.isnan(ans)]=0.
1000 loops, best of 3: 384 µs per loop