web-dev-qa-db-ja.com

オブジェクトdtypeを持つNumpy 2D配列を浮動小数点数の通常の2D配列に変換する方法

私が取り組んでいるより広範なプログラムの一部として、文字列や3D座標などがすべて混在したオブジェクト配列になってしまいました。オブジェクト配列は構造化配列に比べてあまり好きではないかもしれませんが、多くのコードを変更せずにこれを回避したいと思っています。

私の配列obj_array(N行)のすべての行が

Single entry/object of obj_array:  ['NAME',[10.0,20.0,30.0],....] 

今、私はこのオブジェクト配列をロードして、3D座標チャンクをスライスしようとしています。ここまでは、と尋ねるだけですべてが正常に機能します。

obj_array[:,[1,2,3]]

ただし、結果はオブジェクト配列でもあり、次のようにフロートの2D配列を形成したいので、問題が発生します。

size [N,3] of N rows and 3 entries of X,Y,Z coordinates

今のところ、問題を回避するために、行をループし、すべての行を宛先の2Dフロート配列の行に割り当てています。 numpyの配列変換ツールでもっと良い方法があるかどうか疑問に思っていますか?私はいくつかのことを試みました、そしてそれを回避することができませんでした。

Centers   = np.zeros([N,3])

for row in range(obj_array.shape[0]):
    Centers[row,:] = obj_array[row,1]

ありがとう

17
Moe

厄介な小さな問題...私はこのおもちゃの例をいじり回しています:

>>> arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object)
>>> arr
array([['one', [1, 2, 3]],
       ['two', [4, 5, 6]]], dtype=object)

私の最初の推測は:

>>> np.array(arr[:, 1])
array([[1, 2, 3], [4, 5, 6]], dtype=object)

しかし、それによってobject dtypeが保持されるため、おそらく次のようになります。

>>> np.array(arr[:, 1], dtype=np.float)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence.

通常は、次のようにしてこれを回避できます。

>>> np.array(arr[:, 1], dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a readable buffer object

ここではありませんが、これはちょっと困惑しました。リストをタプルで置き換えるとうまくいくので、配列内のオブジェクトがリストを破棄するのは事実です。

>>> np.array([Tuple(j) for j in arr[:, 1]],
...          dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

完全に満足のいく解決策はないようなので、おそらく最も簡単な方法は次のとおりです。

>>> np.array(list(arr[:, 1]), dtype=np.float)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

それはあまり効率的ではありませんが、おそらく次のようなものに行く方が良いでしょう:

>>> np.fromiter((Tuple(j) for j in arr[:, 1]), dtype=[('', np.float)]*3,
...             count=len(arr)).view(np.float).reshape(-1, 3)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
13
Jaime

ハイメのおもちゃの例に基づいて、np.vstack()を使用してこれを非常に簡単に行うことができると思います:

arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object)
float_arr = np.vstack(arr[:, 1]).astype(np.float)

これは、オブジェクト配列の「数値」要素が1D numpy配列、リスト、またはタプルであるかどうかに関係なく機能します。

6
ali_m

これは、配列arrをオブジェクトから浮動小数点数の配列に変換するのに最適です。後の数値処理は非常に簡単です。最後の投稿ありがとうございます!!!!任意のDataFrameサイズを含めるように変更しました:

float_arr = np.vstack(arr[:, :]).astype(np.float)
2
Matt

構造化配列を使用すると、名前と値に個別にアクセスする必要がある場合に簡単にアクセスできます。この例では、2つのデータポイントがあります。

x = zeros(2, dtype=[('name','S10'), ('value','f4',(3,))])
x[0][0]='item1'
x[1][0]='item2'
y1=x['name']
y2=x['value']

結果:

>>> y1
array(['item1', 'item2'], 
      dtype='|S10')
>>> y2
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]], dtype=float32)

詳細はこちら: http://docs.scipy.org/doc/numpy/user/basics.rec.html

1
CT Zhu

この問題は通常、データセットのタイプが異なる場合に発生します。通常、最初の列に日付などがあります。

私が使用しているのは、日付列を別の変数に格納することです。残りの「機能のX行列」をXに取り込みます。たとえば、日付とXがあります。

次に、X行列に次のように変換を適用します。

X = np.array(list(X[:,:]), dtype=np.float)

お役に立てれば幸いです。

1
Pablo Ruiz Ruiz