2014-10-15 17 views
6

İyi günler,Bir yuva üzerinde çok boyutlu bir numpy dizisi gönder

Bunun için aradık ama herhangi bir yanıt almadık. Bir soket üzerinde çok boyutlu bir numpy dizisi göndermek istiyorum. Dolayısıyla, bir dizeye dönüştürmek için karar:

>>> import numpy as np 
>>> x = np.array([[0, 1], [2, 3]]) 
>>> xstring = x.tostring() 
>>> print xstring 

>>> print x 
[[0 1] 
[2 3]] 
>>> print xstring 

>>> nparr = np.fromstring(xstring, dtype=np.uint8) 
>>> print nparr 
[0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0] 

Ben nedense dizeye dönüşüm elde bunun boyutu kaydedebilirsiniz yine de var mı: Ancak

, bu dizinin temsilini yok eder ?

cevap

2

Gerçekten de, .tostring sadece ham verileri verir. Bu, diğer tarafta bilinmediği takdirde, dizinin şekli ve dtype'ını göndermeniz gerektiği anlamına gelir. boyut havai önemli olabilir çok küçük diziler için

import numpy as np 
from cPickle import dumps, loads 

x = np.array([[1, 2],[3, 4]], np.uint8) 
print loads(dumps(x)) 
# [[1 2] 
# [3 4]] 

olsa:

Belki kullanarak diziyi seri hale getirmek için Turşu kolay Turşu kullanma konusunda daha fazla bilgi için

print len(x.tostring()), len(dumps(x)) 
# 4 171 

, see here.

+0

Turşu son derece yavaş ve benim 2d dizi masif yaptı. Ayrıca bazen programımı – ovfstack

+0

@ovfstack istisnaları ile çöktü: Haklısınız. Python 3'te, büyük diziler için ek yük önemsizdir ve '.tostring()' olarak iki kat daha yavaş çalışır. Python 2 için, eğer 'protocol = 2' belirtirseniz büyük bir gelişme görmelisiniz, yine de bu durumda .tostring() 'den 4 kez daha yavaş görünüyor. –

+0

Sadece opencv'nin sağladığı imencode işlevini kullandım. Ayrıca dizimi "sıkıştırmak" mümkün ve imdecode iyi doğruluk ile onu kurtarmak mümkün oldu – ovfstack

5

bu örneği deneyin: -

import socket 
import numpy as np 
from cStringIO import StringIO 

class numpysocket(): 
    def __init__(self): 
     pass 

    @staticmethod 
    def startServer(): 
     port=7555 
     server_socket=socket.socket() 
     server_socket.bind(('',port)) 
     server_socket.listen(1) 
     print 'waiting for a connection...' 
     client_connection,client_address=server_socket.accept() 
     print 'connected to ',client_address[0] 
     ultimate_buffer='' 
     while True: 
      receiving_buffer = client_connection.recv(1024) 
      if not receiving_buffer: break 
      ultimate_buffer+= receiving_buffer 
      print '-', 
     final_image=np.load(StringIO(ultimate_buffer))['frame'] 
     client_connection.close() 
     server_socket.close() 
     print '\nframe received' 
     return final_image 

    @staticmethod 
    def startClient(server_address,image): 
     if not isinstance(image,np.ndarray): 
      print 'not a valid numpy image' 
      return 
     client_socket=socket.socket() 
     port=7555 
     try: 
      client_socket.connect((server_address, port)) 
      print 'Connected to %s on port %s' % (server_address, port) 
     except socket.error,e: 
      print 'Connection to %s on port %s failed: %s' % (server_address, port, e) 
      return 
     f = StringIO() 
     np.savez_compressed(f,frame=image) 
     f.seek(0) 
     out = f.read() 
     client_socket.sendall(out) 
     client_socket.shutdown(1) 
     client_socket.close() 
     print 'image sent' 
     pass 
bu model istemcisinde

sunucuya çok boyutlu ndarray gönderir. İki işlev vardır startServer() ve startClient(). startServer bağımsız değişkenler almaz ancak startClient'in sunucu adresinin yanı sıra argüman olarak ndarray'a ihtiyacı vardır. İlk önce Sunucuyu başlatın ve istemciyi başlatın. Sunucu arabelleği yalnızca istemciden kapatma mesajını aldıktan sonra okumaya başlar.

İlgili konular