19

インデックスとサイズが与えられた場合、標準基底ベクトルを生成するためのより効率的な方法はありますか?

import numpy as np
np.array([1.0 if i == index else 0.0 for i in range(size)])
4

6 に答える 6

20
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.]])

うーん、残念ながら、これに 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

関数でラップ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
于 2012-08-15T18:46:40.493 に答える
11
x = np.zeros(size)
x[index] = 1.0

少なくとも私はそれだと思います...

>>> 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

np.zeros が最速のようです...

于 2012-08-15T18:45:41.273 に答える
8

これがより速いかどうかはわかりませんが、私には間違いなくより明確です。

a = np.zeros(size)
a[index] = 1.0
于 2012-08-15T18:45:44.767 に答える
3

多くの場合、1 つではなくすべての基底ベクトルが必要です。この場合は、次のことを考慮してnp.eyeください。

basis = np.eye(3)
for vector in basis:
  ...

まったく同じではありませんが、密接に関連しています。これは、ちょっとしたトリックで一連の基底行列を取得するためにも機能します。

>>> d, e = 2, 3    # want 2x3 matrices
>>> basis = np.eye(d*e,d*e).reshape((d*e,d,e))
>>> print(basis)
[[[ 1.  0.  0.]
  [ 0.  0.  0.]]

 [[ 0.  1.  0.]
  [ 0.  0.  0.]]

 [[ 0.  0.  1.]
  [ 0.  0.  0.]]

 [[ 0.  0.  0.]
  [ 1.  0.  0.]]

 [[ 0.  0.  0.]
  [ 0.  1.  0.]]

 [[ 0.  0.  0.]
  [ 0.  0.  1.]]]

等々。

于 2017-07-07T10:54:41.703 に答える
1

これは最速ではないかもしれませんが、この方法scipy.signal.unit_impulseは上記の概念を任意の形状の numpy 配列に一般化します。

于 2016-09-27T13:17:57.587 に答える