ここで少し問題があります
私はnumpy.ndarrayを文字列に変換しようとしていますが、すでに次のようにしています:
randomArray.tostring()
動作しますが、numpy.ndarrayに変換できるかどうか疑問に思っています。
これを行う最良の方法は何ですか?
私はnumpy 1.8.1を使用しています
コンテキスト:目的は、numpy.ndarrayをrabbitmq(pikaライブラリ)のメッセージとして送信することです
これには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]
短い答えで申し訳ありませんが、コメントするのに十分なポイントがありません。データ型を明記してください。そうしないと、苦痛の世界に陥ります。
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]])
あなたが整数の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の配列がある場合は、最後の行でint
をfloat
に置き換えてください。
__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]])
_
これは、XML-RPCを使用した ajsp 回答に対する少し即興の回答です。
サーバー側では、データを変換するときに、 '。tostring()'メソッドを使用して、numpyデータを文字列に変換します。これは、numpy ndarrayをバイト文字列としてエンコードします。データを受け取ったクライアント側では、 '。fromstring()'メソッドを使用してデータをデコードします。このために2つの簡単な関数を書きました。これが役に立てば幸いです。
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。