4

各行が異なる番号で開始して終了する2D配列を作成する必要があります。単純に、0から始まり、Wで与えられた別の終点を持つ3X3配列を作成したいとしましょう。複数の開始値と停止値のためのベクトル化されたNumPy linspace

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

もしあなたがpandasを使いたいならば、 '' pd.Series(W).apply(lambda e:np.linspace(0、e、3)) ' – Boud

+0

基本的に2つのベクトル(行列の最初と最後の列) 、正しい?そして、あなたは各行のいくつかの値を補間したいと思うでしょう。 – Kartik

+1

@dayumもし開始位置を変更したいのであれば同じアプローチですが、2つのベクトルの開始と停止でdfを構築し、lambda引き数をdf.start、df.end、3 – Boud

答えて

4

はここbroadcasting使ったアプローチだ -

def create_ranges(start, stop, N, endpoint=True): 
    if endpoint==1: 
     divisor = N-1 
    else: 
     divisor = N 
    steps = (1.0/divisor) * (stop - start) 
    return steps[:,None]*np.arange(N) + start[:,None] 

Samplをe run -

In [22]: # Setup start, stop for each row and no. of elems in each row 
    ...: start = np.array([1,4,2]) 
    ...: stop = np.array([6,7,6]) 
    ...: N = 5 
    ...: 

In [23]: create_ranges(start, stop, 5) 
Out[23]: 
array([[ 1. , 2.25, 3.5 , 4.75, 6. ], 
     [ 4. , 4.75, 5.5 , 6.25, 7. ], 
     [ 2. , 3. , 4. , 5. , 6. ]]) 

In [24]: create_ranges(start, stop, 5, endpoint=False) 
Out[24]: 
array([[ 1. , 2. , 3. , 4. , 5. ], 
     [ 4. , 4.6, 5.2, 5.8, 6.4], 
     [ 2. , 2.8, 3.6, 4.4, 5.2]]) 
+0

なぜlinspaceを利用しないのですか? – Boud

+0

@Boud私は確信していません、それは '2D'で動作しますか? – Divakar

+0

@Divakar私は[this](http://stackoverflow.com/a/16887295/624829)のようなものを意味しました – Boud

1

OPのように、linspaceの使用では、開始がすべての行で0とみなされます。

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

(編集 - これは私が取得すべきかの転置であり、それを移調や[:,None]の使用を切り替えるのいずれか)N = 3000の場合

、それは@Divaker'sソリューションよりも著しく高速です。なぜ私は完全にはわからない。

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 

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

+0

各行の最初と最後の要素に ''が与えられているという質問があるので、各行の開始値と終了値を '' linspace'ベースのソリューションにどのように組み込みますか? – Divakar

関連する問題