新numpy的陣列我有2個numpy的數組:創建基於條件
aa = np.random.rand(5,5)
bb = np.random.rand(5,5)
如何創建,其具有值1時aa和bb的超過0.5的新數組?
新numpy的陣列我有2個numpy的數組:創建基於條件
aa = np.random.rand(5,5)
bb = np.random.rand(5,5)
如何創建,其具有值1時aa和bb的超過0.5的新數組?
隨着焦點上的性能和使用兩種方法可以增加幾aproaches。一種方法是獲取有效值的布爾數組,並使用.astype() method
轉換爲int
數據類型。另一種方式可能涉及使用np.where
,讓我們根據相同的布爾數組在0
和1
之間進行選擇。因此,基本上我們會有兩種方法,一種是利用高效的數據類型轉換,另一種是使用選擇標準。現在,布爾數組可以通過兩種方式獲得 - 一種使用簡單比較,另一種使用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)
你可以玩的數據類型使用較少精確類型,這不應該傷害,因爲我們將值設置爲0
和1
。利益應該是顯着的加速,因爲它利用了內存效率。我們可以使用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
謝謝@Divakar,這是一個非常明確和很好的答案 – user308827
這是怎麼回事?
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
當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
使用Numpy而不使用ufuncs(特別是如果它們存在的話)永遠不會是答案。 –
你可以通過這種方式獲得真正的性能問題。 –
'numpy'的目的是利用矢量化。這顯然不是使用'numpy'的最好方法,或者你不知道'numpy'是如何工作的。 – rayryeng
你是什麼意思時,既aa和bb超過0,aa和bb是包含範圍在[0-1] – BPL
之間的值的矩陣,對不起,已更新的問題。兩者都應該超過0.5 – user308827
當它們低於0.5時會發生什麼?相應的值是0嗎? – ayhan