web-dev-qa-db-ja.com

numpy.ndarrayを文字列(またはバイト)に変換し、numpy.ndarrayに変換します

ここで少し問題があります

私はnumpy.ndarrayを文字列に変換しようとしていますが、すでに次のようにしています:

randomArray.tostring()

動作しますが、numpy.ndarrayに変換できるかどうか疑問に思っています。

これを行う最良の方法は何ですか?

私はnumpy 1.8.1を使用しています

コンテキスト:目的は、numpy.ndarrayをrabbitmq(pikaライブラリ)のメッセージとして送信することです

26
Ampo

これにはfromstring()メソッドを使用できます。

arr =np.array([1,2,3,4,5,6])
ts = arr.tostring()
print np.fromstring(ts,dtype=int)

>>>[1 2 3 4 5 6]

短い答えで申し訳ありませんが、コメントするのに十分なポイントがありません。データ型を明記してください。そうしないと、苦痛の世界に陥ります。

23
ajsp

tostringを使用すると、形状とデータ型の両方に関する情報が失われます。

>>> import numpy as np
>>> a = np.arange(12).reshape(3, 4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> s = a.tostring()
>>> aa = np.fromstring(a)
>>> aa
array([  0.00000000e+000,   4.94065646e-324,   9.88131292e-324,
         1.48219694e-323,   1.97626258e-323,   2.47032823e-323,
         2.96439388e-323,   3.45845952e-323,   3.95252517e-323,
         4.44659081e-323,   4.94065646e-323,   5.43472210e-323])
>>> aa = np.fromstring(a, dtype=int)
>>> aa
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>>> aa = np.fromstring(a, dtype=int).reshape(3, 4)
>>> aa
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

つまり、メタデータとデータを受信者に送信する必要があります。自動整合オブジェクトを交換するには、cPickleを試してください:

>>> import cPickle
>>> s = cPickle.dumps(a)
>>> cPickle.loads(s)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
21
simleo

あなたが整数のnumpy配列を持っていると想像してください(他の型でも動作しますが、若干の修正が必要です)。あなたはこれを行うことができます:

_a = np.array([0, 3, 5])
a_str = ','.join(str(x) for x in a) # '0,3,5'
a2 = np.array([int(x) for x in a_str.split(',')]) # np.array([0, 3, 5])
_

Floatの配列がある場合は、最後の行でintfloatに置き換えてください。

__repr__()メソッドを使用することもできます。これには、多次元配列で機能するという利点があります。

_from numpy import array
numpy.set_printoptions(threshold=numpy.nan)
a = array([[0,3,5],[2,3,4]])
a_str = a.__repr__() # 'array([[0, 3, 5],\n       [2, 3, 4]])'
a2 = eval(a_str) # array([[0, 3, 5],
                 #        [2, 3, 4]])
_
8
Julien Spronck

これは、XML-RPCを使用した ajsp 回答に対する少し即興の回答です。

サーバー側では、データを変換するときに、 '。tostring()'メソッドを使用して、numpyデータを文字列に変換します。これは、numpy ndarrayをバイト文字列としてエンコードします。データを受け取ったクライアント側では、 '。fromstring()'メソッドを使用してデータをデコードします。このために2つの簡単な関数を書きました。これが役に立てば幸いです。

  1. ndarray2str-numpy ndarrayをバイト文字列に変換します。
  2. str2ndarray-バイナリstrをnumpy ndarrayに変換します。
    def ndarray2str(a):
        # Convert the numpy array to string 
        a = a.tostring()

        return a

受信側では、データは 'xmlrpc.client.Binary'オブジェクトとして受信されます。 「。data」を使用してデータにアクセスする必要があります。

    def str2ndarray(a):
        # Specify your data type, mine is numpy float64 type, so I am specifying it as np.float64
        a = np.fromstring(a.data, dtype=np.float64)
        a = np.reshape(a, new_shape)

        return a

注:このアプローチの唯一の問題は、大きなnumpy配列を送信しているときにXML-RPCが非常に遅いことです。 (10、500、500、3)サイズのnumpy配列を送受信するのに約4秒かかりました。

私はpython 3.7.4。

1
Sudheer Raja