2016-08-14 88 views
2

新numpy的陣列我有2個numpy的數組:創建基於條件

aa = np.random.rand(5,5) 
bb = np.random.rand(5,5) 

如何創建,其具有值1時aa和bb的超過0.5的新數組?

+0

你是什麼意思時,既aa和bb超過0,aa和bb是包含範圍在[0-1] – BPL

+0

之間的值的矩陣,對不起,已更新的問題。兩者都應該超過0.5 – user308827

+0

當它們低於0.5時會發生什麼?相應的值是0嗎? – ayhan

回答

6

隨着焦點上的性能和使用兩種方法可以增加幾aproaches。一種方法是獲取有效值的布爾數組,並使用.astype() method轉換爲int數據類型。另一種方式可能涉及使用np.where,讓我們根據相同的布爾數組在01之間進行選擇。因此,基本上我們會有兩種方法,一種是利用高效的數據類型轉換,另一種是使用選擇標準。現在,布爾數組可以通過兩種方式獲得 - 一種使用簡單比較,另一種使用np.logical_and。所以,用兩種方式來獲得布爾陣列和兩個方法爲布爾數組轉換爲int陣列,我們最終會得到四種實現以下所列 -

out1 = ((aa>0.5) & (bb>0.5)).astype(int) 
out2 = np.logical_and(aa>0.5, bb>0.5).astype(int) 
out3 = np.where((aa>0.5) & (bb>0.5),1,0) 
out4 = np.where(np.logical_and(aa>0.5, bb>0.5), 1, 0) 

你可以玩的數據類型使用較少精確類型,這不應該傷害,因爲我們將值設置爲01。利益應該是顯着的加速,因爲它利用了內存效率。我們可以使用int8, uint8, np.int8, np.uint8 types。因此,使用新int數據類型的前面列出方法的變種會 -

out5 = ((aa>0.5) & (bb>0.5)).astype('int8') 
out6 = np.logical_and(aa>0.5, bb>0.5).astype('int8') 
out7 = ((aa>0.5) & (bb>0.5)).astype('uint8') 
out8 = np.logical_and(aa>0.5, bb>0.5).astype('uint8') 

out9 = ((aa>0.5) & (bb>0.5)).astype(np.int8) 
out10 = np.logical_and(aa>0.5, bb>0.5).astype(np.int8) 
out11 = ((aa>0.5) & (bb>0.5)).astype(np.uint8) 
out12 = np.logical_and(aa>0.5, bb>0.5).astype(np.uint8) 

運行測試(如我們的重點是表現這個職位) -

In [17]: # Input arrays 
    ...: aa = np.random.rand(1000,1000) 
    ...: bb = np.random.rand(1000,1000) 
    ...: 

In [18]: %timeit ((aa>0.5) & (bb>0.5)).astype(int) 
    ...: %timeit np.logical_and(aa>0.5, bb>0.5).astype(int) 
    ...: %timeit np.where((aa>0.5) & (bb>0.5),1,0) 
    ...: %timeit np.where(np.logical_and(aa>0.5, bb>0.5), 1, 0) 
    ...: 
100 loops, best of 3: 9.13 ms per loop 
100 loops, best of 3: 9.16 ms per loop 
100 loops, best of 3: 10.4 ms per loop 
100 loops, best of 3: 10.4 ms per loop 

In [19]: %timeit ((aa>0.5) & (bb>0.5)).astype('int8') 
    ...: %timeit np.logical_and(aa>0.5, bb>0.5).astype('int8') 
    ...: %timeit ((aa>0.5) & (bb>0.5)).astype('uint8') 
    ...: %timeit np.logical_and(aa>0.5, bb>0.5).astype('uint8') 
    ...: 
    ...: %timeit ((aa>0.5) & (bb>0.5)).astype(np.int8) 
    ...: %timeit np.logical_and(aa>0.5, bb>0.5).astype(np.int8) 
    ...: %timeit ((aa>0.5) & (bb>0.5)).astype(np.uint8) 
    ...: %timeit np.logical_and(aa>0.5, bb>0.5).astype(np.uint8) 
    ...: 
100 loops, best of 3: 5.6 ms per loop 
100 loops, best of 3: 5.61 ms per loop 
100 loops, best of 3: 5.63 ms per loop 
100 loops, best of 3: 5.63 ms per loop 
100 loops, best of 3: 5.62 ms per loop 
100 loops, best of 3: 5.62 ms per loop 
100 loops, best of 3: 5.62 ms per loop 
100 loops, best of 3: 5.61 ms per loop 

In [20]: %timeit 1 * ((aa > 0.5) & (bb > 0.5)) #@BPL's vectorized soln 
100 loops, best of 3: 10.2 ms per loop 
+0

謝謝@Divakar,這是一個非常明確和很好的答案 – user308827

3

這是怎麼回事?

import numpy as np 

aa = np.random.rand(5, 5) 
bb = np.random.rand(5, 5) 

print aa 
print bb 

cc = 1 * ((aa > 0.5) & (bb > 0.5)) 
print cc 
-3

當AA的元件和BB在索引i超過大於0.5,那麼新的數組 在索引具有1 I

aa = np.random.rand(5,5) 
bb = np.random.rand(5,5) 
new_arr = [] 
for i in range(5): 
    for j in range(5): 
     if aa[i] >0.5 and bb[i]>0.5: 
       new_arr[i] = 1 
     else: 
       new_arr[i] = "any Value You want 
+0

使用Numpy而不使用ufuncs(特別是如果它們存在的話)永遠不會是答案。 –

+0

你可以通過這種方式獲得真正的性能問題。 –

+0

'numpy'的目的是利用矢量化。這顯然不是使用'numpy'的最好方法,或者你不知道'numpy'是如何工作的。 – rayryeng