2009-12-09 6 views
4

나는 numpy 배열을 압축하는 효율적인 방법을 찾고있다. 다음과 같은 배열이 있습니다 : dtype=[(name, (np.str_,8), (job, (np.str_,8), (income, np.uint32)] (내가 가장 좋아하는 예제).numpy 배열 (파이썬)을 압축하는 효율적인 방법

내가 다음과 같이하면 : my_array.compress(my_array['income'] > 10000) 수입이 10000 이상인 새 배열을 얻고 있습니다.

그러나 목록의 작업을 필터링하고 싶다면 작동하지 않습니다!

my__array.compress(m_y_array['job'] in ['this', 'that']) 

오류 :

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

그래서 나는 이런 식으로 뭔가를해야 :

np.array([x for x in my_array if x['job'] in ['this', 'that']) 

이 추악하고 비효율적입니다!

효율적인 아이디어가 있습니까?

는 는
+0

내가 알 수있는 한, 아래의 모든 솔루션에는 마스크의 배열 복사본이 포함됩니다. 그래서 그들 중 누구도 정말 효율적인 IMHO가 아닙니다. – g33kz0r

답변

1

그것은 꽤 같이 원하는 것과 좋은,하지만 난 당신이 할 수 있다고 생각 : 당신이 NumPy와 전용 솔루션을 찾고 있다면

mask = my_array['job'] == 'this' 
for condition in ['that', 'other']: 
    mask = numpy.logical_or(mask,my_array['job'] == condition) 
selected_array = my_array[mask] 
0

, 나는거야 당신을 생각하지 않는다 그것을 얻으십시오. 그래도 커버 아래에서 많은 작업을 수행하지만, tabular 패키지가 원하지 않는 것을 "추악한"방식으로 처리 할 수 ​​있는지 여부를 고려하십시오. C 확장을 직접 작성하지 않고도 "효율적"으로 사용할 수 있을지 확신하지 못합니다.

그건 그렇고, 나는 이것이 어떤 실제 사례에 대해서도 충분히 효율적이고 충분히 귀하다고 생각합니다.

my_array.compress([x in ['this', 'that'] for x in my_array['job']]) 

이 덜 추한보다 효율적으로 만드는 추가 단계, 당신은 아마도 중간에 하드 목록이없는 것, 그래서 나는이 목록 경우보다 검색하는 것이 훨씬 빠릅니다으로는, 대신에 설정 사용 하듯이 목록은 몇 가지 항목 이상을 가지고 : 당신이 충분히 효율적이라고 생각하지 않는 경우, 그래서 당신은 당신이하려고 당신이 현명하게 시간을 보내고있어 자신감을 가지고 있습니다 벤치마킹 좋을 걸

job_set = set(['this', 'that']) 
my_array.compress([x in job_set for x in my_array['job']]) 

더 효율적으로 만들 수 있습니다.

+0

고마워! 아니 순수한 numpy하지만 실제로 꽤 효율적이고 꽤 충분히;) 나는 튜플로 목록을 넣어, 그리고 괜찮 았어 (벤치 마크 아직 ...) – Louis

1

numpy 배열을 압축하는 가장 좋은 방법은 pytables를 사용하는 것입니다. 대량의 수치 데이터를 처리 할 때의 표준입니다.

import tables as t 
hdf5_file = t.openFile('outfile.hdf5') 
hdf5_file.createArray ...... 
hdf5_file.close()