2016-09-22 10 views
2

私は同じ長さのリストを含むこのオブジェクトの配列を持っていると言う1D:変換は、2D数値配列にリストのnumpyの配列オブジェクトとバック

私は数値の2次元配列にこれを変換することができますどのよう
>>> a = np.empty(2, dtype=object) 
>>> a[0] = [1, 2, 3, 4] 
>>> a[1] = [5, 6, 7, 8] 
>>> a 
array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object) 
  1. >>> a.shape 
    (2,) 
    >>> b = WHAT_GOES_HERE(a) 
    >>> b 
    array([[1, 2, 3, 4], 
         [5, 6, 7, 8]]) 
    >>> b.shape 
    (2, 4) 
    
  2. どうすればいいですか?

  3. は私のa配列ではなくnp.arraylistのSよりも、np.array秒のnp.arrayであれば、それは簡単に取得していますか?

    >>> na = np.empty(2, dtype=object) 
    >>> na[0] = np.array([1, 2, 3, 4]) 
    >>> na[1] = np.array([5, 6, 7, 8]) 
    >>> na 
    array([array([1, 2, 3, 4]), ([5, 6, 7, 8])], dtype=object) 
    
  4. np.concatenate使用
+0

'a.astype(int)'? – Divakar

+0

@Divakar: 'ValueError:配列要素をシーケンスで設定しています。 ' - ' astype'は再フォーマットできません – Eric

答えて

3

一つのアプローチ - それは一般的なND形状のために働く作るべき*np.shape(a[0])を使用するように改善が@Ericによって示唆

b = np.concatenate(a).reshape(len(a),*np.shape(a[0])) 

を。

サンプル実行 -

a_back = np.empty(b.shape[0], dtype=object) 
a_back[:] = b.tolist() 

サンプル実行 - -

In [190]: a_back = np.empty(b.shape[0], dtype=object) 
    ...: a_back[:] = b.tolist() 
    ...: 

In [191]: a_back 
Out[191]: array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object) 

In [192]: a_back.shape 
Out[192]: (2,) 

In [183]: a 
Out[183]: array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object) 

In [184]: a.shape 
Out[184]: (2,) 

In [185]: b = np.concatenate(a).reshape(len(a),*np.shape(a[0])) 

In [186]: b 
Out[186]: 
array([[1, 2, 3, 4], 
     [5, 6, 7, 8]]) 

In [187]: b.shape 
Out[187]: (2, 4) 

バックaを取得するには、我々がそうのように、2段階のプロセスを使用することができそうです

+0

逆に良い簡潔な解決策 - 私はforループに頼らざるを得ないと思っていました – Eric

+0

'-1 '' np.shape(a [0]) 'を使うと、より一般的な1DのND - > N + 1Dの場合も同様になります – Eric

+0

@Eric改善のおかげで!投稿を更新しました。 – Divakar

1

あなたはnp.vstack()を使用できます:

>>> a = np.vstack(a).astype(int) 
+0

私は 'astype()'も不要だと思います! – Eric

+0

はい、あなたは正しいですが、最後にintが必要だと明示的には言っていませんでしたが(この例ではどういうわけか...)、 –

+0

私はちょうど数字で、とにかくdtypeはint32です – Eric

0

ここで、所望のnumpyの配列に、次にリストにソースnumpyの配列を変換したアプローチは次のとおり

b = np.array([k for k in a]) 
b 
array([[1, 2, 3, 4], 
     [5, 6, 7, 8]]) 
c = np.array([k for k in b], dtype=object) 
c 
array([[1, 2, 3, 4], 
     [5, 6, 7, 8]], dtype=object) 
0

Iはラウンドトリップlistスルーnp.array(list(a))とは十分であったことを見出しました。

これはnp.stack(a)を使用するのと同じようです。

これらの両方とも、NDアレイの1Dアレイを(N + 1)Dアレイに変換するより一般的なケースで動作するという利点があります。

関連する問題