web-dev-qa-db-ja.com

numpyで1D配列を2D配列に変換する

2D配列の列数を指定して、1次元配列を2次元配列に変換したい。このように機能するもの:

> import numpy as np
> A = np.array([1,2,3,4,5,6])
> B = vec2matrix(A,ncol=2)
> B
array([[1, 2],
       [3, 4],
       [5, 6]])

Numpyには、作成した関数「vec2matrix」のように機能する関数がありますか? (2D配列のように1D配列にインデックスを付けることができると理解していますが、これは私が持っているコードのオプションではありません。この変換を行う必要があります。)

77
Alex Williams

reshape 配列にしたい。

B = np.reshape(A, (-1, 2))
115
Matt Ball

次の2つのオプションがあります。

  • 元の形状が不要になった場合、最も簡単な方法は、新しい形状を配列に割り当てることです。

    a.shape = (a.size//ncols, ncols)
    

    a.size//ncols-1を切り替えて、適切な形状を自動的に計算できます。 a.shape[0]*a.shape[1]=a.size以外の場合は、何らかの問題が発生することを確認してください。

  • np.reshape関数を使用して新しい配列を取得できます。これは、上記のバージョンとほぼ同様に機能します

    new = np.reshape(a, (-1, ncols))
    

    可能であれば、newは初期配列aの単なるビューになります。つまり、データは共有されます。ただし、場合によっては、new配列は代わりにacopyになります。 np.reshapeは、行優先のC順序から列優先のFortran順序に切り替えることができるオプションのキーワードorderも受け入れることに注意してください。 np.reshapeは、a.reshapeメソッドの関数バージョンです。

要件a.shape[0]*a.shape[1]=a.sizeを尊重できない場合、新しい配列を作成する必要があります。 np.resize関数を使用して、次のようにnp.reshapeと混合できます。

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)
35
Pierre GM

次のようなものを試してください:

B = np.reshape(A,(-1,ncols))

ただし、配列内の要素の数をncolsで除算できることを確認する必要があります。また、Bキーワードを使用して、orderに数値が取り込まれる順序で遊ぶこともできます。

4
JoshAdel