2016-11-23 18 views
3

私は、状態が任意の次元数のnumpy配列で表される変数のセットを統合するシミュレーションモデルを持っています。シミュレーションの後、特定の時点で要素が可変状態を表す配列のリストが作成されました。N個の次元の配列を複数の1D配列に分割する

シミュレーション結果を出力するために、これらの配列を複数の1D配列に分割します。ここで要素は状態変数の同じコンポーネントに時間的に対応します。以下は、複数の時間ステップにわたる2D状態変数の例です。

import numpy as np 

# Arbitrary state that is constant 
arr = np.arange(9).reshape((3, 3)) 

# State variable through 3 time steps 
state = [arr.copy() for _ in range(3)] 

# Stack the arrays up to 3d. Axis could be rolled here if it makes it easier. 
stacked = np.stack(state) 

私が取得する必要があり、出力は次のようになります。

[np.array([0, 0, 0]), np.array([1, 1, 1]), np.array([2, 2, 2]), ...] 

私はnp.split(stacked, sum(stacked.shape[:-1]), axis=...)をやってみました(axis=のためにすべてを試してみました)が、次のエラーを取得しました:ValueError: array split does not result in an equal divisionを。これを行う方法は、一般的なケースで動作するnp.nditernp.splitを使用しますか?

は、私はこれがやってに相当します推測:

また、私は得ることを望んだ順序で
I, J, K = stacked.shape 

result = [] 

for i in range(I): 
    for j in range(J): 
     result.append(stacked[i, j, :]) 

。しかし、私はそれがより一般的になるために私が利用することができるnumpyの何かがあることを望んでいます。

答えて

2

-

np.split(stacked.ravel(),np.prod(stacked.shape[:2])) 

サンプルの実行単純なlist()は、それを3つの要素配列のリストに変換します:

In [190]: stacked.reshape(-1,3) 
Out[190]: 
array([[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5], 
     [6, 6, 6], 
     [7, 7, 7], 
     [8, 8, 8]]) 
In [191]: list(stacked.reshape(-1,3)) 
Out[191]: 
[array([0, 0, 0]), 
array([1, 1, 1]), 
array([2, 2, 2]), 
array([3, 3, 3]), 
array([4, 4, 4]), 
array([5, 5, 5]), 
array([6, 6, 6]), 
array([7, 7, 7]), 
array([8, 8, 8])] 

np.split(stacked.reshape(-1,3),9)は、1x3配列のリストを生成します。

np.splitは1つの軸でのみ機能しますが、最初の2つに分割する必要があります。したがって、変形またはラブが必要です。

nditerを忘れてください。それはcythonでコードを修正するための足がかりです。これは、通常の反復を支援しない - ndindexで使用する場合、それはあなたのi,jダブルループ合理化できることを除い:

In [196]: [stacked[idx] for idx in np.ndindex(stacked.shape[:2])] 
Out[196]: 
[array([0, 0, 0]), 
array([1, 1, 1]), 
array([2, 2, 2]), 
array([3, 3, 3]), 
array([4, 4, 4]), 
array([5, 5, 5]), 
array([6, 6, 6]), 
array([7, 7, 7]), 
array([8, 8, 8])] 

を=====================異なるstate付=

、ちょうど

stack

In [302]: state 
Out[302]: 
[array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]), array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]), array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]])] 
In [303]: np.stack(state,axis=2).reshape(-1,3) 
Out[303]: 
array([[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5], 
     [6, 6, 6], 
     [7, 7, 7], 
     [8, 8, 8]]) 

異なる軸上にスタックすることは、寸法が追加される場合をより詳細に制御を与える以外は、かなり np.arrayようなものです。しかし、コードを見てください。

+0

'list'の素敵な使い方!かなり速く見えます。一般的なものにするために、おそらくシェイプのparamを 'list(stacked.reshape(-1、stacked.shape [-1]))'という形で使うことができます。 – Divakar

+0

私は入力例の配列を使いこなしました。 'stacked = np.stack(state)'でなければなりません。質問が更新されましたので、あなたの答えは 'list(stacked.reshape(3、-1).T)'になるはずです。私は@Divakar、 'list'の素晴らしい使い方に同意します! – pbreach

+0

どうすれば別の軸にスタックするのですか?私の編集を参照してください – hpaulj

1

あなたが平坦化されたバージョンにnp.splitを使用するので、同様に、1Dリストとして部品の適切な数に切ることができる - 私は9x3にそれを再構築した場合

In [406]: stacked 
Out[406]: 
array([[[0, 0, 0], 
     [1, 1, 1]], 

     [[2, 2, 2], 
     [3, 3, 3]], 

     [[4, 4, 4], 
     [5, 5, 5]], 

     [[6, 6, 6], 
     [7, 7, 7]]]) 

In [407]: np.split(stacked.ravel(),np.prod(stacked.shape[:2])) 
Out[407]: 
[array([0, 0, 0]), 
array([1, 1, 1]), 
array([2, 2, 2]), 
array([3, 3, 3]), 
array([4, 4, 4]), 
array([5, 5, 5]), 
array([6, 6, 6]), 
array([7, 7, 7])] 
+0

ああ、私はなぜ私が「分裂」を働かせることができなかったのだろうと思っていた。私は今夜​​後にこれを撃ちます。 – pbreach

+0

編集を参照してください - おそらく 'スプリット'はまだ動作するかもしれませんが、わからないと思います。 – pbreach

関連する問題