좋아, 일부 검색 후 나는이 문제를 직접 해결할 수있는 질문을 찾을 수 없습니다. 나는 가면을 쓴 배열을 조사해 보았다. 비록 그들이 시원하게 보일지라도, 나는 그들이 필요한 것인지 확실하지 않다.파이썬 numpy 마스크 평균 성능
zone_data
동일한 값을 가진 요소 덩어리와 NumPy와 2-D 배열이다
2 개 NumPy와 배열을 고려한다. 이것은 내 '영역'입니다.
value_data
은 임의의 값을 갖는 2 차원 숫자 배열 (정확한 zone_data 모양)입니다.
영역 번호 대신 각 영역의 평균값을 가진 zone_data/value_data와 같은 모양의 번호가있는 배열을 찾습니다.
예 ... 아스키 예술 형식입니다.
zone_data
(4 별개의 영역) :
1, 1, 2, 2
1, 1, 2, 2
3, 3, 4, 4
3, 4, 4, 4
value_data
:
1, 2, 3, 6
3, 0, 2, 5
1, 1, 1, 0
2, 4, 2, 1
내 결과, 그것은 result_data
전화 :
1.5, 1.5, 4.0, 4.0
1.5, 1.5, 4.0, 4.0
2.0, 2.0, 1.0, 1.0
2.0, 2.0, 1.0, 1.0
여기 내가 가지고있는 코드입니다. 나에게 완벽한 결과를주는 한 잘 작동합니다.
result_data = np.zeros(zone_data.shape)
for i in np.unique(zone_data):
result_data[zone_data == i] = np.mean(value_data[zone_data == i])
내 배열이 크고 코드 조각이 몇 초 걸립니다. 나는 지식 격차가 있고 도움이되는 어떤 것도 치지 않았다고 생각한다. 루프 측면은 라이브러리 또는 무언가로 위임되어야합니다 ... aarg!
나는 이걸 더 빨리 만들 수 있도록 도움을 구한다! 파이썬 신들, 너의 지혜를 구한다!
편집 - 추가 벤치 마크 스크립트
import numpy as np
import time
zones = np.random.randint(1000, size=(2000,1000))
values = np.random.rand(2000,1000)
print 'start method 1:'
start_time = time.time()
result_data = np.zeros(zones.shape)
for i in np.unique(zones):
result_data[zones == i] = np.mean(values[zones == i])
print 'done method 1 in %.2f seconds' % (time.time() - start_time)
print
print 'start method 2:'
start_time = time.time()
#your method here!
print 'done method 2 in %.2f seconds' % (time.time() - start_time)
내 출력 :
start method 1:
done method 1 in 4.34 seconds
start method 2:
done method 2 in 0.00 seconds
'bincount'를 잘 사용합니다.+1 –
DSM, 멋지다! 나는 나 자신을 찾기 위해 오랜 시간이 걸렸을 몇 가지 구체적인 지식을 공유 할 수있는 자신과 같은 사람들 때문에 주로 그렇게 사랑합니다. 정말 고맙습니다! 이것은 사소한 운동이 아니 었습니다 ... 이것은 응용 프로그램에서 가지고있는 병목 중 하나를 열 것입니다. 사랑 "np.allclose"도 ... 무슨 보석. – user1269942