2017-01-25 18 views
2

私はn値を持つnumpyの1次元配列を持っています。それをxdataと呼ぶことができます。多次元配列の作成方法は?

多次元numpy配列を作成してxdataMultiという名前を付けて、この配列の各ディメンションに特定の範囲の値のxdataが含まれるようにしたいと考えています。例えば

等その

xdata = np.array([-0.879645943,-0.7897614865,-0.7051130178,-0.6108652382,-0.5270894341,...]) 

と私はxdataMulti[:,0]-0.9-0.6間XDATAのすべての値を入れたいということと-0.6間のすべての値およびxdataMulti[:,1]0

どのように言うことができます私はxdataMultiを作成して記入します(私はどれくらいの範囲を持っていますか、エンドポイントはどれくらいですか?xdataのポイント数はどれくらいか分かりませんが、xdataをループする必要があります)

+1

を並べ替え!各ディメンションのエントリの長さは同じにする必要があります。 – Lagerbaer

+1

さまざまなサイズの配列のリストを記述しています。 – hpaulj

+0

はいこれは、さまざまなサイズの配列のリストです。 numpy配列しか受け付けないscipy関数を呼び出すには、それぞれnumpy配列が必要です。 – user2175783

答えて

2

範囲のあなたの数があまり大きくない場合は、手

fはあなたのscipyのダウンロード機能をある
gm09 = xdata >= -0.9 
gm06 = xdata >= -0.6 
g0 = xdata >= 0 
ranges = [xdata[gm09 & ~gm06], xdata[gm06 & ~g0]] 
result = [f(r) for r in ranges] 

して作成することができます。

範囲の数が大きい場合は、データを並べ替えてから searchsortedを使用できます。あなたがソートされた配列bndにブロックの境界を持っていると仮定すると:

xs = np.sort(xdata) 
xbnd = np.searchsorted(xs, bnd) 
ranges = [xs[l:r] for l, r in zip(xbnd[:-1], xbnd[1:])] 
result = [f(r) for r in ranges] 

注これはあなたの範囲がソートされることで、第一の溶液と異なっていること。あなたが使用することができ、元の順序を維持する必要がある場合は

間接的numpyの(マルチ)次元配列がために意図されているものを実際にはないこと

order = np.argsort(xdata) 
xbnd = np.searchsorted(xdata[order], bnd) 
ordord = [np.sort(order[l:r]) for l, r in zip(xbnd[:-1], xbnd[1:])] 
ranges = [xdata[oo] for oo in ordord] 
result = [f(r) for r in ranges] 
+1

中間コードでは、xs = np.sort(xdata) xbnd = np.searchsorted(xs、bnd) 範囲= [xs [1:r]のl、rはzip(xbnd [: - 1]、xbnd範囲内のrについては、結果は[f(r)] * xbndは[6,18]、zipは[(6,18)]、範囲オブジェクトには6 18(0と6と18との間で、最後は選択されません)。 – JennyToy

+1

@JennyToy Hm、そうではありませんか? xbndが6で開始すると、xdataの中の最小の6つの値が最小のビン境界より下にあることを意味します。したがって、元のQ.これらの異常値を収集したい場合は、いつでもxbnd = np.r_ [0、xbnd、len(xdata)]のようなことをすることができます –

1

多次元配列は長方形でなければなりません。すべての行/列の長さが同じでない場合は、運がなくなります。

しかし、これに対処する方法があります。一つの方法は、arrayslistを作成するには、次のようになります。

>>> arr = np.random.random((10)) # using this for values 

>>> # each item in ranges corresponds to the lower and upper border. 
>>> ranges = [(0, 0.3), (0.3, 0.6), (0.6, 1)] 

>>> [arr[(arr >= lower) & (arr < upper)] for lower, upper in ranges] 
[array([ 0.15346374]), 
array([ 0.38144735, 0.45017858, 0.52710788, 0.36339812]), 
array([ 0.79770651, 0.77543868, 0.94824291, 0.87412998, 0.70890894])] 

多次元配列、配列のリストだけではなく、十分かもしれニーズに応じないことを。