2017-07-21 7 views
-1

私は現在、Scikit-Learn関数をサルキーパッチしていますが、その1行に2次元のNumPy配列が必要です。しかし、私が扱っているデータは3次元のNumPy配列なので、「あまりにも多くの値を解凍する」というエラーが発生します。次元を変更せずに多次元NumPy配列の形状を変更する

私はK-Means関数fitを呼び出してデータをクラスタリングしています。データが表す

X = np.array([[[1, 2, 3], 
       [4, 5, 6]], 

       [[7, 8, 9], 
       [10, 11, 12]], 

       [[13, 14, 15], 
       [16, 17, 18]]]) 

n_samples, n_features = X.shape 

Xは、次のような3つの寸法を持つ配列である:私の問題は、X私が渡しndarrayあると仮定すると、このコードの次の行に要約します6次元のデータポイントの時系列のグループ。例えば、最初の要素[[1, 2, 3], [4, 5, 6]]は、2つの期間からのサンプルを有する時系列を表し、各サンプルは3次元を有する。

ndarrayndarrayでクラスタリングを実行できるようにするには、k_means_コードをサルでパッチしました。私の目標は、2Dアレイでk-meansを実行することです。

3D ndarrayの形状を2つの要素に設定できますか?たとえば、3D配列をオブジェクトの2D配列に変換しようとしましたが、変換が3D配列に変換されてしまいます。

np.array([[x.astype(object) for x in c] for c in combined]) 

同様に、次のコードも同様に3D配列に変換されます。それは正しい配列を作成するよう

np.array([[np.array(x) for x in c] for c in combined]) 

リストの内包[[x.astype(object) for x in c] for c in combined]は見えませんが、それはタイプリストであるため、それはもはや機能で動作します。

3D NumPy配列を2次元に「変換」する方法を探しています。どんな助けでも大歓迎です!

注:アレイの形状を変更する方法はありません。私はすべてのディメンションを保持する必要がありますが、ディメンションの1つを無視するようにシェイプを変更します。

+0

に保存します。しかし、あなたが私たちに何を求めているかを伝える必要があります。 –

+0

寸法は形状タプルの長さです。 'n_samples、n_features = X.shape'は、2要素タプルを2つの変数にアンパックする標準のPython式です。すべてのサブリストが同じサイズであれば、配列やリストを含むオブジェクトdtype配列を作成するのは難しいです。しかし、たとえ成功しても、コードが使えるように見えません。 – hpaulj

+0

@hpauljはい、わかりました。私の問題は、私の 'X.shape'には3つの要素があり、関数のその行に展開することができないということです。私は、 '' ndarrays'の2次元配列か 'objects'の2次元配列であるかのように、' X'だけが2次元であると考えるように行を "トリック"する方法を探しています – victor

答えて

1

np.arrayはできるだけ高次元の配列を作成しようとするため、配列の配列を作成するにはいくつかのトリックを実行する必要があります。サブアレイのサイズが異なる場合はOKですが、すべて同じであれば、それを戦わなければなりません。再び

In [813]: A = np.empty((6,),object) 

コピー値を(と

In [812]: arr = np.arange(24).reshape(2,3,4) 

と正しいサイズの空のオブジェクト配列(しかし平坦化):3D配列と

開始:

は、ここに1つの方法です平滑化)し、目標形状に変形する。

In [814]: A[:]=list(arr.reshape(-1,4)) 
In [815]: A=A.reshape(2,3) 
In [816]: A 
Out[816]: 
array([[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8, 9, 10, 11])], 
     [array([12, 13, 14, 15]), array([16, 17, 18, 19]), 
     array([20, 21, 22, 23])]], dtype=object) 

これで、(2,3)の配列が得られました。その形状は解凍できます。

私はnp.empty((2,3),object)で開始しようとしましたが、A[:,:]=...割り当てを取得できませんでした。このオブジェクトの形状を変更するには、arrを配列のリストに分割する必要があります。オブジェクト配列は、リストのように、ポインタの配列です。

しかし、scikit関数はそのような配列を受け入れますか? (形のハードルを通過した後)。私は、オブジェクトの再形成が目に見える短所であると考えています。


In [824]: [[x.astype(object) for x in c] for c in arr] 
Out[824]: 
[[array([0, 1, 2, 3], dtype=object), 
    array([4, 5, 6, 7], dtype=object), 
    array([8, 9, 10, 11], dtype=object)], 
[array([12, 13, 14, 15], dtype=object), 
    array([16, 17, 18, 19], dtype=object), 
    array([20, 21, 22, 23], dtype=object)]] 
In [825]: _[0][0].shape 
Out[825]: (4,) 

これは、内部要素(4)オブジェクト配列された状態で、リストのネストされたリストを作成します。 np.arrayにラップし、dtypeオブジェクトで3次元配列を再作成します。いくつかの未知の理由のために、あなたが行うにはしたくない


整形は、数値DTYPEこれができない可能性がある

In [828]: arr.reshape(2,-1) 
Out[828]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
     [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]]) 
In [829]: arr.reshape(-1,4) 
Out[829]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15], 
     [16, 17, 18, 19], 
     [20, 21, 22, 23]]) 
+0

あなたの答えをありがとう!これは完全にndarrayのndarrayを作成するのに役立ちました。私はそれをより多くの猿のパッチと組み合わせなければならなかったが、それはついに働いた:) – victor

関連する問題