2016-08-14 116 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