2016-07-23 4 views
6

크기 N * M의 행렬을 가지고 있으며 각 행의 평균값을 찾고 싶습니다. 값은 1에서 5 사이이며 값이없는 항목은 0으로 설정됩니다. 그러나 다음 방법을 사용하여 평균을 찾으려면 값이있는 항목을 계산할 때 잘못된 평균을 갖습니다. 0.0이 아닌 값의 너비 평균

matrix_row_mean= matrix.mean(axis=1) 

0이 아닌 값의 평균은 어떻게 얻을 수 있습니까?

답변

10

각 행의 0이 아닌 개수를 가져 와서 각 행의 합계를 평균하는 데 사용합니다. 과 같이, np.true_divide를 대체하는 당신이 NumPy와의 이전 버전에있는 경우, 당신은 카운트의 부동 소수점 변환을 사용할 수 있습니다

np.true_divide(matrix.sum(1),(matrix!=0).sum(1)) 

- - 따라서, 구현은 다음과 같을 것이다

matrix.sum(1)/(matrix!=0).sum(1).astype(float) 

샘플 실행 -

In [160]: matrix 
Out[160]: 
array([[0, 0, 1, 0, 2], 
     [1, 0, 0, 2, 0], 
     [0, 1, 1, 0, 0], 
     [0, 2, 2, 2, 2]]) 

In [161]: np.true_divide(matrix.sum(1),(matrix!=0).sum(1)) 
Out[161]: array([ 1.5, 1.5, 1. , 2. ]) 

또 다른 방법은 문제가 대체하는 것입니다 해결하기 위해 NaNs과 제로는 다음과 같이 그 NaNs 효과 그 원래의 zeros에를 무시 것이다, np.nanmean 사용 -

np.nanmean(np.where(matrix!=0,matrix,np.nan),1) 

보기의 성능 관점에서, 나는 첫 번째 방법을 추천 할 것입니다.

+0

np는 (는) 속성 없음 true_divide – HimanAB

+0

@HimanUCC 수정 사항을 확인하십시오. – Divakar

+0

마스크 된 배열 접근법은 작지만 (반드시 빠를 필요는 없음) :'np.ma.masked_equal (matrix, 0) .mean (axis = 1)' – hpaulj

관련 문제