2015-05-11 16 views
11

Tôi đang gặp một chút rắc rối tại đây,Chuyển đổi một numpy.ndarray thành chuỗi (hoặc byte) và chuyển đổi nó thành numpy.ndarray

Tôi đang cố gắng chuyển đổi một numpy.ndarray thành chuỗi, tôi ' đã thực hiện điều đó như sau:

randomArray.tostring() 

Nó hoạt động, nhưng tôi tự hỏi liệu tôi có thể chuyển đổi nó trở lại thành một mảng không.

Cách tốt nhất để làm điều này là gì?

Tôi đang sử dụng NumPy 1.8.1

Bối cảnh: Mục tiêu là để gửi numpy.ndarray dưới dạng tin nhắn trong RabbitMQ (thư viện pika)

+0

Bạn có thể tìm thấy câu trả lời này hữu ích: [1]: http://stackoverflow.com/questions/5387208/convert-a-string-to-an- array – Singularity

+0

Đáng buồn là phương thức tostring() trả về byte và tôi không biết cách chuyển đổi nó ngay cả với giải pháp này. – Ampo

Trả lời

10

Bạn có thể sử dụng phương pháp fromstring() cho việc này:

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

>>>[1 2 3 4 5 6] 

Xin lỗi vì câu trả lời ngắn, không đủ điểm để nhận xét. Hãy nhớ nêu rõ các kiểu dữ liệu hoặc bạn sẽ kết thúc trong một thế giới đau đớn.

+1

tôi không biết về 'fromstring', tốt đẹp! tuy nhiên, nó dường như không hoạt động mảng đa chiều (trả về phiên bản 'phẳng 'của mảng đa chiều). Tôi đoán bạn có thể định hình lại mảng sau đó nếu bạn biết kích thước. –

+0

Điều này có thể làm việc, điều kỳ lạ là phương thức 'tostring()' của tôi trả về những điều kỳ lạ (byte?) 'Fromstring()' không hoạt động hoàn hảo. – Ampo

+0

@Ampo bạn có thể sử dụng repr (ts) để xem nhị phân, nhưng bạn sẽ phải chuyển đổi nó bằng cách sử dụng np.fromstring (ts, dtype = int), hãy nhớ sử dụng đúng loại dữ liệu. Bạn đang sử dụng phao hoặc số nguyên? Đăng loại mảng bạn đang cố gắng gửi. – ajsp

3

Hãy tưởng tượng bạn có một mảng NumPy của số nguyên (nó hoạt động với các loại khác nhưng bạn cần một số sửa đổi nhỏ). Bạn có thể làm điều này:

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]) 

Nếu bạn có một loạt các phao, hãy chắc chắn để thay thế int bởi float trong dòng cuối cùng.

Bạn cũng có thể sử dụng phương pháp __repr__(), mà sẽ có lợi thế để làm việc cho mảng đa chiều:

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]]) 
+0

Vì tôi sử dụng phương thức 3D-Array (hình ảnh) nên phương thức '__repr __()' sẽ hoạt động nhưng không. Mảng thực sự lớn (1000000+ giá trị trong nó) tôi kết thúc với 1000 giá trị sau khi chuyển đổi nó với '__repr __()' và 'eval()' sập (?) – Ampo

+0

@Ampo yes, __repr __() treo với mảng lớn hơn vì của việc biểu diễn các mảng có khối lượng lớn (mảng lớn có '...' thay vì mảng đầy đủ). Bạn có thể thay đổi hành vi đó (với set_printoptions) ... Tôi chỉ cần chỉnh sửa câu trả lời của tôi, xem nếu nó hoạt động tốt hơn. –

9

Nếu bạn sử dụng tostring bạn bị mất thông tin về cả hình dáng và kiểu dữ liệu:

>>> 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]]) 

Điều này có nghĩa bạn phải gửi các siêu dữ liệu cùng với các dữ liệu cho người nhận. Để trao đổi đối tượng tự động phù hợp, hãy thử cPickle:

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

dtype quan trọng: 'np.uint8' /' np.uint16' – mertyildiran

Các vấn đề liên quan