2017-05-09 4 views
2

AB을 두 개의 행렬을 같은 셀에 0으로 가질 때 어떻게 파이썬에서 두 개의 numpy 행렬을 나눌 수 있습니까?나노가 발생할 수있는 numpy 행렬로 나누기

기본적으로 A[i,j]>=B[i,j] 모두 i, j입니다. C=A/B을 계산해야합니다. 하지만 때로는 A[i,j]==B[i,j]==0입니다. 그리고 이런 일이 발생하면 A[i,j]/B[i,j]을 0으로 정의해야합니다.

모든 색인을 거치지 않고 간단한 비단뱀 방법이 있습니까?

당신은 그렇지 A and B being both zeros과 같은 경우 사이에서 선택하고 0을 넣어 또는 각각 elementwise 부문에 np.where와 마스크를 사용할 수
+0

이 https://docs.scipy.org에서보세요 /doc/numpy-1.12.0/reference/generated/numpy.divide.오류 처리를위한 HTML 및 https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.seterr.html#numpy.seterr . – max9111

+1

다음과 같이 중복 될 수 있습니다. http://stackoverflow.com/questions/34257436/after-division-by-0-replace-nan-with-0-in-numpy-arrays – dudakl

+0

가능한 중복 기준 [ 0, numpy 배열에서 0으로 NaN 바꾸기] (http://stackoverflow.com/questions/34257436/after-division-by-0-replace-nan-with-0-in-numpy-arrays) – dudakl

답변

2

- 마스크 만들기에 대한

from __future__ import division # For Python 2.x 

mask = (A == B) & (A==0) 
C = np.where(mask, 0, A/B) 

: (A==B) 모두의 마스크 것 AB 사이의 요소와 (A==0)의 요소는 모두 A에 0 인 모든 요소의 마스크가 있습니다. 따라서, 결합 된 마스크가 (A == B) & (A==0) 인 경우, 우리는 AB이 모두 0 인 곳의 마스크를 갖습니다. 더 간단 같은 작업을 할 수있는 버전 어쩌면 쉽게 모두 AB에 제로를 확인하는 것입니다 이해하고 그것은 다음과 같습니다 np.where의 이용에 대해

mask = (A==0) & (B==0) 

, 그 구문은 다음과 같습니다

C = np.where(mask, array1, array2) 

즉, 우리는 마스크에 따라 C에 assinging 요소를 선택합니다. 해당 마스크 요소가 True 인 경우 array1에서 해당 요소를 선택하고 그렇지 않은 경우 array2에서 해당 요소를 선택합니다. 이것은 요소 단위로 이루어 지므로 출력은 C입니다.

샘플 실행 -

In [48]: A 
Out[48]: 
array([[4, 1, 4, 0, 3], 
     [0, 4, 1, 4, 3], 
     [1, 0, 0, 4, 0]]) 

In [49]: B 
Out[49]: 
array([[4, 2, 2, 1, 4], 
     [2, 1, 2, 4, 2], 
     [4, 0, 2, 0, 3]]) 

In [50]: mask = (A == B) & (A==0) 

In [51]: np.where(mask, 0, A/B) 
Out[51]: 
array([[ 1. , 0.5 , 2. , 0. , 0.75], 
     [ 0. , 4. , 0.5 , 1. , 1.5 ], 
     [ 0.25, 0. , 0. , inf, 0. ]]) 
+0

이것이 내가 stackoverflow를 좋아하는 이유입니다. 내가 이해조차하지 않는 대답. 이것은 무엇입니까? mask = (A == B) & (A == 0)? –

+0

@PietroSperoni 게시물에 몇 가지 설명을 추가했습니다. 희망을 갖고 그것들을 이해하십시오. – Divakar

+0

좋습니다. 마스크는 기본적으로 첫 번째 또는 두 번째를 선택할 위치를 나타내는 true 및 false 행렬입니다. –

3

당신은 np.true_divide처럼 ufuncs에 대한 where 인수를 사용할 수 있습니다

np.true_divide(A, B, where=(A!=0) | (B!=0)) 

을 더 음의 값이 없습니다 (주석에 명시된) 및 각 A >= B 경우 요소 (질문에 명시된대로)를 사용하면 다음과 같이 간단하게 할 수 있습니다.

np.true_divide(A, B, where=(A!=0)) 
B[i, j] == 0을 의미하기 때문에

입니다. 그냥 분할 후 nan의 대체 : 대안으로

import numpy as np 
A = np.random.randint(0, 3, (4, 4)) 
B = np.random.randint(0, 3, (4, 4)) 
print(A) 
print(B) 
print(np.true_divide(A, B, where=(A!=0) | (B!=0))) 

[[1 0 2 1] 
[1 0 0 0] 
[2 1 0 0] 
[2 2 0 2]] 

[[1 0 1 1] 
[2 2 1 2] 
[2 1 0 1] 
[2 0 1 2]] 

[[ 1. 0. 2. 1. ] 
[ 0.5 0. 0. 0. ] 
[ 1. 1. 0. 0. ] 
[ 1. inf 0. 1. ]] 

: 예를 들어


C = A/B   # may print warnings, suppress them with np.seterrstate if you want 
C[np.isnan(C)] = 0 
관련 문제