2017-09-20 8 views
1

특정 임계 값 내에있는 거대한 파이썬 ndarray의 값을 0으로 바꾸고 싶습니다. [-0.1 and 0.1]의 임계 값 안에 말하십시오. 가장 효율적인 방법은 무엇입니까? 이것은 상당히 큰 배열 :특정 임계 값을 만족시키는 파이썬 ndarray의 값 바꾸기

>>>np.shape(np_w) 
shape=(1, 1, 1024, 1024) dtype=float32 

나는 우리가 matlab에의 ismember 여기이없는 알고 있지만, NumPy와 문서를 검색, 나는 np.in1dnp.isin을 발견했다. 내 솔루션은 지금까지 좋은 모양과 속도를하지 않습니다

import numpy as np 
Threshhold=X 

res=np.isin(np_w,np_w[(np_w>=-Threshhold) & (np_w<=Threshhold)]) 
indicesToReplace=np.where(res) 
np_w[indicesToReplace]=0 

답변

2

당신이 (integer array indexing에 비슷하지만이 경우에는이 조건 주위 np.where 필요하지 않습니다) abs<boolean array indexing을 사용할 수 0 주위에 대칭 간격의 경우 :

my_np[abs(my_np) <= treshhold] = 0 

이 절대 값이 임계 값보다 작거나 같은 모든 값을 0으로 바꿉니다. 좀 더 일반적인 솔루션을 필요로하는 경우에

이 낮은 임계 값의 절대이 상한 임계 값 같지 않은 말, 당신은 &를 사용하여 식을 결합 할 수 있습니다 :

my_np[(my_np >= lower_treshhold) & (my_np <= upper_threshhold)] = 0 
+0

감사합니다, @MSeifert을. 그러니 기본적으로 당신의 접근 방식은 단 하나의 라이너 일뿐입니다. 'np.isin' 필요 없어, 그렇지? – Amir

+0

이것은 불행히도 매우 느립니다. – Amir

+0

Slow? 무엇에 비해? – MSeifert

2

는 개인적으로 내가 np.wherenp.logical_and의 조합을 사용합니다.

>>> import numpy as np 
>>> threshold = 0.5 
>>> my_arr = np.random.randn(20) 
>>> my_arr 
array([-0.28094279, 1.28432282, 0.2585762 , 0.41902366, 1.21350506, 
     -0.40586786, -1.04135578, -1.06168061, 0.25554365, -0.75404457, 
     1.4755498 , -0.14902854, 0.15225808, 0.03667505, 0.6158351 , 
     0.05171262, 1.09116325, -0.5897306 , -0.69801693, -0.31560829, 
     -0.36665813, -0.98115761, 1.21050881, 0.66356061, -0.03960144]) 
>>> my_arr[np.where(np.logical_and(np.greater(my_arr, -threshold), np.less(my_arr, threshold)))[0]] = np.nan 
>>> my_arr 
array([  nan, 1.28432282,   nan,   nan, 1.21350506, 
       nan, -1.04135578, -1.06168061,   nan, -0.75404457, 
     1.4755498 ,   nan,   nan,   nan, 0.6158351 , 
       nan, 1.09116325, -0.5897306 , -0.69801693,   nan, 
       nan, -0.98115761, 1.21050881, 0.66356061,   nan])