9

各行が異なる番号で開始および終了する可能性がある 2D 配列を作成する必要があります。各行の最初と最後の要素が指定され、他のすべての要素が行の長さに応じて補間されると仮定します単純なケースでは、0 で同じ開始点を持ち、以下の W で指定された異なる終了点を持つ 3X3 配列を作成したいとします。

array([[ 0.,  1.,  2.],
       [ 0.,  2.,  4.],
       [ 0.,  3.,  6.]])

これを行うには、次の方法よりも良い方法はありますか。

D=np.ones((3,3))*np.arange(0,3)
D=D/D[:,-1] 
W=np.array([2,4,6]) # last element of each row assumed given
Res= (D.T*W).T  
4

4 に答える 4

1

OP のように、この の使用はlinspace、すべての行の開始が 0 であることを前提としています。

x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)

(編集 - これは私が取得すべきものの転置です。転置するか、の使用を切り替えます[:,None]

@Divaker'sN=3000 の場合、ソリューションよりも著しく高速です。理由はよくわかりません。

In [132]: timeit N=3000;x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)
10 loops, best of 3: 91.7 ms per loop
In [133]: timeit create_ranges(np.zeros(N),np.arange(0,2*N,2),N)
1 loop, best of 3: 197 ms per loop
In [134]: def foo(N):
     ...:     D=np.ones((N,N))*np.arange(N)
     ...:     D=D/D[:,-1]
     ...:     W=np.arange(0,2*N,2)
     ...:     return (D.T*W).T
     ...: 
In [135]: timeit foo(3000)
1 loop, best of 3: 454 ms per loop

============

開始と停止を使用すると、次を使用できます。

In [201]: starts=np.array([1,4,2]); stops=np.array([6,7,8])
In [202]: x=(np.linspace(0,1,5)[:,None]*(stops-starts)+starts).T
In [203]: x
Out[203]: 
array([[ 1.  ,  2.25,  3.5 ,  4.75,  6.  ],
       [ 4.  ,  4.75,  5.5 ,  6.25,  7.  ],
       [ 2.  ,  3.5 ,  5.  ,  6.5 ,  8.  ]])

よりも少し遅くなる余分な計算がありますcreate_ranges

In [208]: timeit N=3000;starts=np.zeros(N);stops=np.arange(0,2*N,2);x=(np.linspace(0,1,N)[:,None]*(stops-starts)+starts).T
1 loop, best of 3: 227 ms per loop

これらのソリューションはすべて、startsとの間で線形補間を行うというアイデアの単なるバリエーションstopsです。

于 2016-11-16T07:37:01.937 に答える