2017-02-27 48 views
0

我正在使用theano.clip來限制我的numpy數組的值。對於例如在Theano中剪切後計算飽和值

array = np.array([[ 1., -1., -3., 1., 1.], 
     [ 3., -4., -5., 0., -1.], 
     [ 8., -3., -7., -3., -3.], 
     [ 8., 2., -2., -3., -3.], 
     [ 7., 0., 0., 1., 0.]]) 

max_val = np.array([2.0]).astype('float32') 

T.clip(array, -max_val, max_val).eval() 

輸出:

array([[ 1., -1., -2., 1., 1.], 
     [ 2., -2., -2., 0., -1.], 
     [ 2., -2., -2., -2., -2.], 
     [ 2., 2., -2., -2., -2.], 
     [ 2., 0., 0., 1., 0.]]) 

我要計算有多少值的削波操作後用夾子固定。可能嗎?

+0

之後或之前,如果無論如何它是可能的。我需要限制這些值,但爲了統計目的,我需要計算削減後丟失了多少數據。 – blackbug

回答

1

下面是與np.count_nonzero的值的超出與針對最小和最大極限比較計算出的限制的掩模一種方法 -

np.count_nonzero((array < -max_val) | (array > max_val)) 

np.count_nonzero是爲性能,因爲它的掩模/布爾陣列上操作得到總數爲pretty efficiently

或者,使用絕對值爲最小和最大限制爲在此情況下更短的版本它們是相同的限制次數的只是負的和正的值 -

np.count_nonzero(np.abs(array) > max_val) 

樣品運行 -

In [267]: array 
Out[267]: 
array([[ 1., -1., -3., 1., 1.], 
     [ 3., -4., -5., 0., -1.], 
     [ 8., -3., -7., -3., -3.], 
     [ 8., 2., -2., -3., -3.], 
     [ 7., 0., 0., 1., 0.]]) 

In [268]: max_val = np.array([2.0]).astype('float32') 

In [269]: np.count_nonzero((array < -max_val) | (array > max_val)) 
Out[269]: 13 

In [270]: np.count_nonzero(np.abs(array) > max_val) 
Out[270]: 13 
+0

感謝您的答覆。我現在正在使用「where」數組[np.where(abs(array)> max_val)]''。你認爲哪一個會快得多? – blackbug

+1

@blackbug不要使用'np.where'。直接使用mask:'array [abs(array)> max_val]'。但是這給了你自己的元素,而不是數量,所以這與計算剪切元素的數量不同。 – Divakar

1

如果陣列的名字是a,你可以做

np.logical_or(a >= 1, a <= -1).sum() 

你不會指望元素兩次,因爲- max_val < max_val。但是,這需要a兩次傳球。