문제

누구 든지이 문제에 올라 온 적이 있습니까? 다음과 같은 두 개의 배열이 있다고 가정 해 봅시다.

a = array([1,2,3,4,5,6])
b = array([1,4,5])

B에 존재하는 요소를 비교할 수있는 방법이 있습니까? 예를 들어,

c = a == b # Wishful example here
print c
array([1,4,5])
# Or even better
array([True, False, False, True, True, False])

나는 수백만의 요소가있는 나이가 걸리기 때문에 루프를 피하려고 노력하고 있습니다. 어떤 아이디어?

건배

도움이 되었습니까?

해결책

실제로, 이것들보다 훨씬 간단한 솔루션이 있습니다.

import numpy as np

a = array([1,2,3,4,5,6])
b = array([1,4,5])

c = np.in1d(a,b)

결과 C는 다음과 같습니다.

array([ True, False, False,  True,  True, False], dtype=bool)

다른 팁

np.intersect1d를 사용하십시오.

#!/usr/bin/env python
import numpy as np
a = np.array([1,2,3,4,5,6])
b = np.array([1,4,5])
c=np.intersect1d(a,b)
print(c)
# [1 4 5]

NP.intersect1d는 A 또는 B에 비 유니 키 요소가있는 경우 잘못된 답변을 제공합니다. 이 경우 np.intersect1d_nu를 사용하십시오.

또한 np.setDiff1d, setXor1d, setMember1d 및 Union1d도 있습니다. 보다Doc과 Numpy 예제 목록

답장을 보내 주셔서 감사합니다 kaizer.se. 그것은 내가 찾고 있던 것이 아니라 친구의 제안과 당신이 말한 것을 다음과 같이 생각해 냈습니다.

import numpy as np

a = np.array([1,4,5]).astype(np.float32)
b = np.arange(10).astype(np.float32)

# Assigning matching values from a in b as np.nan
b[b.searchsorted(a)] = np.nan

# Now generating Boolean arrays
match = np.isnan(b)
nonmatch = match == False

약간 번거로운 과정이지만 루프를 쓰거나 루프와 함께 직조를 사용하는 것입니다.

건배

Numpy는 정렬 된 및 고유 한 배열에서 작동하는 설정 함수 Numpy.setmember1d ()를 가지고 있으며 원하는 부울 배열을 정확하게 반환합니다. 입력 배열이 기준과 일치하지 않으면 설정 형식으로 변환하고 결과의 변환을 반전해야합니다.

import numpy as np
a = np.array([6,1,2,3,4,5,6])
b = np.array([1,4,5])

# convert to the uniqued form
a_set, a_inv = np.unique1d(a, return_inverse=True)
b_set = np.unique1d(b)
# calculate matching elements
matches = np.setmea_set, b_set)
# invert the transformation
result = matches[a_inv]
print(result)
# [False  True False False  True  True False]

편집 : 불행히도 Numpy의 SetMember1D 메소드는 실제로 비효율적입니다. 검색이 정렬 된 메소드를 정렬하고 할당하는 방법이 더 빠르게 작동하지만 직접 할당 할 수있는 경우 결과에 직접 할당하고 불필요한 복사를 많이 피할 수 있습니다. 또한 B에 a에없는 것이 포함 된 경우 방법이 실패합니다. 다음은 이러한 오류를 수정합니다.

result = np.zeros(a.shape, dtype=np.bool)
idxs = a.searchsorted(b)
idxs = idxs[np.where(idxs < a.shape[0])] # Filter out out of range values
idxs = idxs[np.where(a[idxs] == b)] # Filter out where there isn't an actual match
result[idxs] = True
print(result)

내 벤치 마크는 1m 요소 A 및 100 요소 b의 Numpy SetMember1D의 경우 91US 대 6.6ms 에서이 사실을 보여줍니다. b.

Ebresset, 너의 답 A가 B의 서브 세트가 아니라면 작동하지 않습니다 (및 A와 B는 정렬되지 않음). 그렇지 않으면 검색어가 거짓 지수를 반환합니다. 나는 비슷한 일을하고 당신의 코드와 결합해야했습니다.

# Assume a and b are sorted
idxs = numpy.mod(b.searchsorted(a),len(b))
idxs = idxs[b[idxs]==a]
b[idxs] = numpy.nan
match = numpy.isnan(b)

예제는 세트와 같은 동작을 암시하며 더 많은 관심을 돌립니다 배열의 존재 올바른 장소에 올바른 요소가있는 것보다. Numpy는 수학적 배열과 행렬과 다르게이를 수행하며 정확한 위치의 항목에 대해서만 알려줍니다. 당신을 위해 그 일을 할 수 있습니까?

>>> import numpy
>>> a = numpy.array([1,2,3])
>>> b = numpy.array([1,3,3])
>>> a == b
array([ True, False,  True], dtype=bool)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top