문제
누구 든지이 문제에 올라 온 적이 있습니까? 다음과 같은 두 개의 배열이 있다고 가정 해 봅시다.
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)