numpy数组的零或空

时间:2017-03-31 16:17:28

标签: python arrays numpy

我正在编写代码并且效率非常重要。 实际上我需要2d数组,我在for循环中填充0和1。什么更好,为什么?

  1. 制作空数组并用" 0"填充它和" 1"。它的伪代码,我的阵列会更大。

  2. 使用零填充数组并使if()如果不为零 - 放一个。

  3. 所以我需要更有效的信息: 1.把每个元素放在#34; 0"和" 1"清空数组 要么 2.制作if()(' if'的效率)然后只放" 1"元件。

3 个答案:

答案 0 :(得分:2)

  • empty()没有初始化内存,因此你的数组将被垃圾填满,你必须初始化所有单元格。
  • zeros()将所有内容初始化为0.因此,如果您的最终结果包含大量零,这将节省您手动将所有这些数组单元设置为零的时间。

我会选择零()。无论如何,性能瓶颈将是你的python for循环。

幸运的是,Numpy现在是一个JIT编译器,它可以将你的蹩脚和慢速python for循环转换成机器代码:

http://numba.pydata.org/

我试了一下。它的边缘有点粗糙,但与裸蟒蛇代码相比,加速可以非常壮观。当然最好的选择是使用numpy进行矢量化,但你并不总是有选择。

答案 1 :(得分:1)

Ae = np.empty(10000)
A0 = np.zeros((10000)

初始分配内存的方式略有不同。但是如果你继续做像

这样的事情,时间上的任何差异都会很小
for i in range(10000):
    Ae[i] = <some calc>

for i in range(10000):
    val = <some calc>
    if val>0:
       A0[i] = val

如果我必须这样循环,我会继续使用np.zeros,并使用无条件分配。它使代码更简单,并且与正在发生的所有其他内容相比,时间差异将很小。

抽样时间:

In [33]: def foo0(N):
    ...:     A = np.empty(N,int)
    ...:     for i in range(N):
    ...:         A[i] = np.random.randint(0,2)
    ...:     return A
    ...: 
In [34]: def foo1(N):
    ...:     A = np.zeros(N,int)
    ...:     for i in range(N):
    ...:         val = np.random.randint(0,2)
    ...:         if val:
    ...:             A[i] = val
    ...:     return A
    ...: 

分配10 0/1值的3种方法

In [35]: foo0(10)
Out[35]: array([0, 0, 1, 0, 0, 1, 0, 1, 1, 0])
In [36]: foo1(10)
Out[36]: array([0, 1, 1, 1, 1, 1, 1, 1, 0, 0])
In [37]: np.random.randint(0,2,10)
Out[37]: array([0, 1, 1, 0, 1, 1, 1, 0, 0, 1])

次:

In [38]: timeit foo0(1000)
100 loops, best of 3: 4.06 ms per loop
In [39]: timeit foo1(1000)
100 loops, best of 3: 3.95 ms per loop
In [40]: timeit np.random.randint(0,2,1000)
... cached.
100000 loops, best of 3: 13.6 µs per loop

2个循环时间几乎相同。

答案 2 :(得分:1)

最好创建零数组并使用if-else填充它。即使条件会使代码变慢,重新整形空数组或将其与新向量连接,每次循环迭代操作都会更慢,因为每次创建新大小的新数组并将旧数组与新向量值一起复制到值。 / p>