【发布时间】:2015-04-27 22:40:53
【问题描述】:
概述
在 numpy 中,我有一个布尔数组。该数组是从图像中检索的;它是二维的,包含 1024 列和 768 行。我想通过以太网电缆推送这些数据。有多种方法可以做到这一点,但就我而言,速度非常关键,因此内存也非常关键。
由于每个数组中有1024 x 768 = 786432 元素(像素),并且每个元素要么是True 要么是False,因此理论上可以将数组打包成98,304 个未压缩字节或96 KB。
786432 bits / 8 bits per byte = 98304 bytes
98304 bytes / 1024 bytes per kilobyte = 96 kilobytes
这需要展平数组
[ [True, False, True, ..., True]
[False, True, True, ..., True]
...
[True, True, False, ..., False] ]
# flatten the array
[True, False, True, ..., False]
理论上可以表示为字节的位,因为 786,432 位均匀地适合 98,304 字节;每个数组应该能够由 98,304 个八位字符表示。
问题
如何通过以太网快速发送 1024×768 bool numpy 数组?我正在研究 bitstring python 库,但我不确定如何快速将 numpy 数组通过管道传输到 bitstring 类中。
其他信息/问题
具体来说,我将这些数组从 Raspberry Pi 2 发送到常规 Raspberry Pi。
-
socket和SOCK_STREAM是最快的解决方法吗? - 鉴于 RPis 计算能力,压缩和解压缩数组会更快吗?如果是这样,压缩必须是无损的。
- 我已经研究过序列化 numpy 数组而不是使用
bitstring的东西,但是腌制的对象太大而无法通过SOCK_STREAM发送。我对socket的东西做错了吗?
我的代码/解决方案 [已解决]
客户
import socket
from scipy.misc import imread
import numpy
IP = '127.0.0.1'
PORT = 7071
ADDRESS = (IP, PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
image = imread('input.png')[:,:,[2]]
image[image < 170] = 0
image[image != 0] = 1
image = numpy.reshape(image, (-1, 1))
image = numpy.packbits(image)
data = image.tostring()
sock.connect(ADDRESS)
for i in range(0, 93804, 1024):
sock.send(data[i:i+1024])
sock.shutdown(socket.SHUT_WR)
sock.close()
服务器
import socket
from scipy.misc import imsave
import numpy
IP = '127.0.0.1'
PORT = 7071
ADDRESS = (IP, PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(ADDRESS)
sock.listen(1)
while True:
c, addr = sock.accept()
data = ''
package = c.recv(1024)
while package:
data += package
package = c.recv(1024)
image = numpy.fromstring(data, dtype=numpy.uint8)
image = numpy.unpackbits(image)
image = numpy.reshape(image, (-1, 768))
imsave('output.png', image)
c.close()
sock.close()
如您所见,我通过一系列 1024 字节数据包通过 TCP/SOCK_STREAM 结束了每个数组。
【问题讨论】:
标签: python arrays numpy pickle