IT이야기

기능 다중 조건의 Numpy

cyworld 2022. 3. 9. 10:05
반응형

기능 다중 조건의 Numpy

나는 dists라고 불리는 일련의 거리를 가지고 있다.나는 두 값 사이의 구분을 선택하고 싶다.나는 그것을 하기 위해 다음과 같은 코드의 줄을 썼다.

 dists[(np.where(dists >= r)) and (np.where(dists <= r + dr))]

그러나 이 옵션은 조건에 대해서만 선택된다.

 (np.where(dists <= r + dr))

임시 변수를 사용하여 명령을 순차적으로 실행하면 잘 작동한다.위 코드는 왜 작동하지 않고, 어떻게 하면 작동하게 되는가?

건배.

가장 좋은 방법은 두 가지 기준을 하나의 기준으로 바꾸는 것이다.

dists[abs(dists - r - dr/2.) <= dr/2.]

그것은 단지 하나의 부울 배열만 만들어낼 뿐이고, 내 생각에 그것은 그것이 또는 ? 안에 있다고 말하기 때문에 읽기 더 쉽다. (하지만 나는 다시 정의하겠다.)rr = r + dr/2. 하지만 그것은 당신의 질문에 대답하지 않는다.


질문에 대한 답변:
없어where단지 의 요소들을 걸러내려고 한다면dists기준에 맞지 않는 경우:

dists[(dists >= r) & (dists <= r+dr)]

왜냐하면&원소로서 너에게 줄 것이다.and( 괄호 필요).

또는, 만약 당신이 사용하길 원한다면where어떤 이유로든 다음을 수행할 수 있다.

 dists[(np.where((dists >= r) & (dists <= r + dr)))]

이유:
안 는 그그가 있기 이다.np.where부울 배열이 아닌 인덱스 목록을 반환한다.너 지금 하려고 하는 거야.and두 개의 숫자 리스트 사이에, 물론 그 리스트는 없다.True/False당신이 기대하는 가치들만약a, 그리고b둘 다 이다True그 다음, 가치관a and b돌아온다b그래서 이런 말을 하는 거야.[0,1,2] and [2,3,4]그냥 너에게 줄 것이다[2,3,4]실행 중:

In [230]: dists = np.arange(0,10,.5)
In [231]: r = 5
In [232]: dr = 1

In [233]: np.where(dists >= r)
Out[233]: (array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),)

In [234]: np.where(dists <= r+dr)
Out[234]: (array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]),)

In [235]: np.where(dists >= r) and np.where(dists <= r+dr)
Out[235]: (array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]),)

예를 들어, 비교를 기대했던 것은 단순히 부울 배열이었습니다.

In [236]: dists >= r
Out[236]: 
array([False, False, False, False, False, False, False, False, False,
       False,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True], dtype=bool)

In [237]: dists <= r + dr
Out[237]: 
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True, False, False, False, False, False,
       False, False], dtype=bool)

In [238]: (dists >= r) & (dists <= r + dr)
Out[238]: 
array([False, False, False, False, False, False, False, False, False,
       False,  True,  True,  True, False, False, False, False, False,
       False, False], dtype=bool)

이제 전화할 수 있다.np.where결합된 부울 배열에서:

In [239]: np.where((dists >= r) & (dists <= r + dr))
Out[239]: (array([10, 11, 12]),)

In [240]: dists[np.where((dists >= r) & (dists <= r + dr))]
Out[240]: array([ 5. ,  5.5,  6. ])

또는 고급 인덱싱을 사용하여 원래 배열을 부울 배열로 인덱싱하십시오.

In [241]: dists[(dists >= r) & (dists <= r + dr)]
Out[241]: array([ 5. ,  5.5,  6. ])

받아들여진 대답은 그 문제를 충분히 잘 설명했다.그러나 복수 조건을 적용하기 위한 Numpythonic 접근법은 Numpy 논리 함수를 사용하는 것이다.이 경우 사용할 수 있다.np.logical_and:

np.where(np.logical_and(np.greater_equal(dists,r),np.greater_equal(dists,r + dr)))

여기서 짚고 넘어가야 할 한 가지 흥미로운 점은 ORAND를 사용하는 일반적인 방법은 이 경우 효과가 있을 것이지만 약간의 변화만 있으면 효과가 있을 것이다."그리고" 대신 "또는" 대신 "또는" 대신 "암페르산드(&)"와 "파이프 오퍼레이터"(|)를 사용하면 효과가 있을 것이다.

'and'를 사용할 때:

ar = np.array([3,4,5,14,2,4,3,7])
np.where((ar>3) and (ar<6), 'yo', ar)

Output:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

암페르산드(&):

ar = np.array([3,4,5,14,2,4,3,7])
np.where((ar>3) & (ar<6), 'yo', ar)

Output:
array(['3', 'yo', 'yo', '14', '2', 'yo', '3', '7'], dtype='<U11')

그리고 판다 데이터프레임의 경우 여러 필터를 적용하려고 할 때도 마찬가지다.이 이면의 추론은 논리 연산자 및 비트 와이즈 연산자와 관련이 있으며, 이에 대해 좀 더 이해하기 위해 스택 오버플로에서 이 질문이나 이와 유사한 Q/A를 살펴보도록 제안하고자 한다.

갱신하다

사용자가 괄호 안에 (ar)3과 (ar<6)를 줄 필요가 있느냐고 물었다.자, 여기에 있어요.여기서 무슨 일이 일어나고 있는지 얘기하기 전에, 파이썬에서 연산자 우선 순위에 대해 알아야 해.

BODMAS에 관한 것과 비슷하게, 비단뱀은 또한 먼저 행해져야 할 것에 우선권을 준다.괄호 안의 항목을 먼저 수행한 다음 비트 연산자가 출근한다.아래에는 당신이 사용했을 때와 사용하지 않았을 때 두 경우 모두에서 어떤 일이 일어나는지 보여 주겠다.

사례1:

np.where( ar>3 & ar<6, 'yo', ar)
np.where( np.array([3,4,5,14,2,4,3,7])>3 & np.array([3,4,5,14,2,4,3,7])<6, 'yo', ar)

여기에 대괄호가 없기 때문에 비트 연산자()&여기서 헷갈리고 있는 것은 논리적인 것을 얻기 위해 무엇을 요구하는 것인지 입니다. 왜냐하면, 연산자 우선 순위표에서,&에 우선하다<또는>교환원여기 가장 낮은 우선순위에서 가장 높은 우선순위까지의 표가 있다.

여기에 이미지 설명을 입력하십시오.

공연도 안 하고.<, 그리고>논리 AND 작업을 수행하라는 요청을 받는 작업.그래서 그런 오류를 범하는 겁니다.

자세한 내용은 다음 링크를 참조하십시오. 연산자 우선 순위

사례 2:

만약 당신이 브래킷을 사용한다면, 당신은 무슨 일이 일어나는지 확실히 알 것이다.

np.where( (ar>3) & (ar<6), 'yo', ar)
np.where( (array([False,  True,  True,  True, False,  True, False,  True])) & (array([ True,  True,  True, False,  True,  True,  True, False])), 'yo', ar)

True와 False의 두 배열.그리고 당신은 논리적으로 AND 연산을 쉽게 수행할 수 있다.다음과 같은 이점을 누리십시오.

np.where( array([False,  True,  True, False, False,  True, False, False]),  'yo', ar)

그리고 np.p.n.p.p.pres는, 주어진 경우, True가 어디에 있든지, 첫 번째 값(즉, 여기 'yo')을 할당하고, 만약 False가 있다면 다른 값(즉, 여기서, 원본을 보관함)을 할당한다.

그게 다야.내가 질의에 대해 잘 설명해 줬으면 좋겠다.

나는 사용하는 것을 좋아한다.np.vectorize그런 일을 위하여다음을 고려하십시오.

>>> # function which returns True when constraints are satisfied.
>>> func = lambda d: d >= r and d<= (r+dr) 
>>>
>>> # Apply constraints element-wise to the dists array.
>>> result = np.vectorize(func)(dists) 
>>>
>>> result = np.where(result) # Get output.

사용할 수도 있다.np.argwhere대신에np.where명확한 생산을 위해

시도:

import numpy as np
dist = np.array([1,2,3,4,5])
r = 2
dr = 3
np.where(np.logical_and(dist> r, dist<=r+dr))

출력: (배열([2, 3, 4]),)

자세한 내용은 Logic 함수를 참조하십시오.

시도:

np.intersect1d(np.where(dists >= r)[0],np.where(dists <= r + dr)[0])

이기능이작동해야 함:

dists[((dists >= r) & (dists <= r+dr))]

나는 이 간단한 예를 생각해 보았다.

import numpy as np

ar = np.array([3,4,5,14,2,4,3,7])

print [X for X in list(ar) if (X >= 3 and X <= 6)]

>>> 
[3, 4, 5, 4, 3]

갖기 위해np.where()여러 조건을 사용하여 작업하는 경우 다음을 수행하십시오.

np.where((condition 1) & (condition 2)) # for and
np.where((condition 1) | (condition 2)) # for or

나는 이것이 다른 대답들을 반복한다는 것을 알지만, 여전히 궁금해 하는 사람들을 위해 이 간단한 대답을 여기에 넣는다. "왜 내가 에 대해 짜증나는 오류 메시지를 받고 있는 걸까?"The truth value of an array with more than one element is ambiguous"원문의 다소 전문화된 성격을 다루고 있는 매우 장황하고 복잡한 대답에 혼란스러워하는 사람들이다.

이제, 당신이 사용할 때 왜 numpy breakes를 사용하는지.and대신에&나는 여기서 그것에 대답하려고 하지 않을 것이다.그것은 단지 설명을 위해 여기서 다른 해답을 볼 뿐이다.일관성 있는 IMHO를 위해 강요하지 말고 그냥 고쳐야 할 것 같다.아니면 적어도 그들은 특별한 오류 메시지를 만들어야 한다.:)

참조URL: https://stackoverflow.com/questions/16343752/numpy-where-function-multiple-conditions

반응형