2017-10-23 12 views
1

matrixの各行または列の真の平均(行または列の平均値を計算するときにゼロ要素を数えない)を計算する関数を1つ書くだけです。私はそれがaxisパラメータをそれぞれ1または0として使用して行ごとまたは列ごとの計算であるかどうかを制御しようとします。 I行(axis = 1)によって計算する場合 `` matrix [:、mask] `を` `matrix [mask、:]`に `0`と` 1`だけを使って入れ替える?

これ

は、

eachPSM = np.ones([5,4]) 
eachPSM[0] = 0 
eachPSM[2,2:4] = 5 
print each PSM 
> [[ 0. 0. 0. 0.] 
[ 1. 1. 1. 1.] 
[ 1. 1. 5. 5.] 
[ 1. 1. 1. 1.] 
[ 1. 1. 1. 1.]] 
ans = true_mean(eachPSM,0) 
print ans 
> [ 1. 1. 2. 2.] 

しかしながらバイカラム計算

def true_mean(matrix, axis): 
    countnonzero = (matrix!=0).sum(axis) 
    mask = countnonzero!=0 
    output_mat = np.zeros(matrix.T.shape[axis]) 
    output_mat[mask] = matrix[:,mask].sum(axis)/countnonzero[mask] # line4 
    return output_mat 

テスト機能の関数であり、変更する必要があるだけline4

output_mat[mask] = matrix[mask,:].sum(axis)/countnonzero[mask] 

ここで数字01のみを使用してmatrix[:,mask]matrix[mask,:]に反転する方法は?だから、私は行と列からの真の平均を計算するための関数を1つだけ持つことができます。

+1

もっとも怠慢な(依然として速い)溶液は、行列[ ''に分岐if'あろう:, '' axis = 1'のための '' matrix [:、mask] 'を指定します。 – lebenlechzer

答えて

2

あなたは[]オペレータが入力引数としてタプル取るという事実に使用することができます。

indexer = [slice(None), slice(None)] 
indexer[axis] = mask 

print(x[indexer]) 

slice(None):と同等ですが、私たちは完全な行列[:, :]をとるタプルを構築してのエントリを置き換えます所望の軸をマスクと合わせる。

完全例:

import numpy as np 

x = np.arange(9).reshape(3, 3) 
mask = np.array([True, False, True]) 

for axis in [0, 1]: 
    indexer = [slice(None)] * x.ndim 
    indexer[axis] = mask  
    print(x[indexer]) 

プリント

[[0 1 2] 
[6 7 8]] 

[[0 2] 
[3 5] 
[6 8]] 
関連する問題