有效的标准基础向量与numpy

Nei*_*l G 14 python numpy

给定索引和大小,是否有更有效的方法来生成标准基础向量:

import numpy as np
np.array([1.0 if i == index else 0.0 for i in range(size)])
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 15

In [2]: import numpy as np

In [9]: size = 5

In [10]: index = 2

In [11]: np.eye(1,size,index)
Out[11]: array([[ 0.,  0.,  1.,  0.,  0.]])
Run Code Online (Sandbox Code Playgroud)

嗯,不幸的是,使用np.eye这个很慢:

In [12]: %timeit np.eye(1,size,index)
100000 loops, best of 3: 7.68 us per loop

In [13]: %timeit a = np.zeros(size); a[index] = 1.0
1000000 loops, best of 3: 1.53 us per loop
Run Code Online (Sandbox Code Playgroud)

包装np.zeros(size); a[index] = 1.0的功能,使只有适度差异,仍比快得多np.eye:

In [24]: def f(size, index):
   ....:     arr = np.zeros(size)
   ....:     arr[index] = 1.0
   ....:     return arr
   ....: 

In [27]: %timeit f(size, index)
1000000 loops, best of 3: 1.79 us per loop
Run Code Online (Sandbox Code Playgroud)


Jor*_*ley 7

x = np.zeros(size)
x[index] = 1.0
Run Code Online (Sandbox Code Playgroud)

至少我认为这就是......

>>> t = timeit.Timer('np.array([1.0 if i == index else 0.0 for i in range(size)]
)','import numpy as np;size=10000;index=5123')
>>> t.timeit(10)
0.039461429317952934  #original method
>>> t = timeit.Timer('x=np.zeros(size);x[index]=1.0','import numpy as np;size=10000;index=5123')
>>> t.timeit(10)
9.4077963240124518e-05 #zeros method
>>> t = timeit.Timer('x=np.eye(1.0,size,index)','import numpy as np;size=10000;index=5123')
>>> t.timeit(10)
0.0001398340635319073 #eye method
Run Code Online (Sandbox Code Playgroud)

看起来像np.zeros是最快的...


mgi*_*son 6

我不确定这是否更快,但对我来说肯定更清楚.

a = np.zeros(size)
a[index] = 1.0
Run Code Online (Sandbox Code Playgroud)