我想将一个特定阈值内的巨大python ndarray的值替换为0.在[-0.1 and 0.1]
的阈值内。什么是最有效的方式?这是一个相当大的数组:
>>>np.shape(np_w)
shape=(1, 1, 1024, 1024) dtype=float32
我知道我们这里没有Matlab的ismember
,但是,在搜索numpy文档时,我找到了np.in1d
和np.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
答案 0 :(得分:2)
我个人会使用np.where
和np.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])
答案 1 :(得分:2)
如果它是0
周围的对称间隔,您可以使用abs
和<
以及boolean array indexing(类似于integer array indexing,但在这种情况下,您不需要围绕条件的np.where
:
my_np[abs(my_np) <= treshhold] = 0
这将用0
替换绝对值小于或等于阈值的所有值。
如果您需要更通用的解决方案,比如说下限阈值的绝对值不等于上限阈值,那么您可以使用&
组合表达式:
my_np[(my_np >= lower_treshhold) & (my_np <= upper_threshhold)] = 0