【问题标题】:Convert string back to numpy array将字符串转换回numpy数组
【发布时间】:2019-01-02 09:32:42
【问题描述】:

我正在使用 python 进行视频聊天。我正在使用 CV2 捕获当前图像(这给了我一个 numpy 数组),然后我将 numpy 发送到我的服务器。现在我在服务器上有一个字符串,我需要将它解码回一个 numpy 数组。

我正在使用 Python 3.7,但我还没有想出一些想法。

    #client 
    #capture 500 frames
    while i < 500:
        i = i + 1
        # Capture frame-by-frame
        ret, frame = cap.read()
        #send data                           
        client_socket.send(bytes(str(ret) + "###" + str(frame), "utf-8"))


    #server
    #split ret and frame
    ret, frame = str(conn.recv(16000)).split("###")
    gray = cv2.cvtColor(frame.toNumpyArray #PseudoMethod  <-- Here
    ,cv2.COLOR_BGR2GRAY)

我只需要一种将字符串转换回 numpy 数组的方法。 如果我打印出来,字符串看起来像这样:

b'[[[128 255 255]\n [125 255 255]\n [107 255 255]\n ...\n [102 130 167]\n [102 128 172]\n [102 128 172]]\n\n [[128 255 255]\n [127 255 255]\n [108 255 255]\n ...\n [102 130 167]\n [102 128 172]\n [102 128 172]]\n\n [[111 255 255]\n [111 255 255]\n [109 255 255]\n ...\n [ 99 131 169]\n [ 99 131 169]\n [ 99 131 169]]\n\n ...\n\n [[ 27 64 95]\n [ 29 67 97]\n [ 24 66 98]\n ...\n [ 73 117 160]\n [ 70 119 161]\n [ 70 119 161]]\n\n [[ 18 71 81]\n [ 20 74 83]\n [ 30 67 93]\n ...\n [ 77 117 159]\ n [ 74 118 163]\n [ 74 118 163]]\n\n [[ 14 68 77]\n [ 19 73 82]\n [ 30 67 93]\n ...\n [ 77 117 159] \n [ 74 118 163]\n [ 74 118 163]]]'

对不起,我的英语不好,我是德国学生。

【问题讨论】:

  • 你能提供一个你得到的字符串的例子吗?
  • 我已经发布了一个例子
  • 您似乎正在寻找serialize的方法
  • 看到“...”了吗?那是缺少数据。您无法从中恢复原件。 str 是序列化数组的错误方法。

标签: python python-3.x numpy


【解决方案1】:

以下一对程序演示了一种通过网络套接字通信 numpy ndarray 对象的方法。客户端使用 save 方法将数组转换为字节流,将流写入 BytesIO 对象,然后通过套接字发送到服务器:

import numpy as np
import socket
from io import BytesIO

# Create an output socket connected to server
sout = socket.create_connection(('127.0.0.1', 6543))

# Create data and write binary stream out to socket

a = np.array([[1.1, 2.2, 3.3],
              [4.4, 5.5, 6.6],
              [7.7, 8.8, 9.9]])

b = BytesIO()
np.save(b, a)

sout.send(b.getvalue())
sout.close()

服务器侦听适当的网络地址,接收数据直到结束套接字关闭。然后它将接收到的数据转换为BytesIO 对象,numpy 的load 函数从中恢复结构:

import numpy as np
import socket
from io import BytesIO

# Create socket listening on correct port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 6543))
s.listen()

# Accept a connection and receive data
sock, address = s.accept()
data = b''
while True:
    indt = sock.recv(1024)
    if not indt:
        break
    data += indt

# Take data and recast to np.ndarray
data = BytesIO(data)

b = np.load(data)
print(type(b), b, sep='\n')

运行服务器的输出如下:

<class 'numpy.ndarray'>
[[1.1 2.2 3.3]
 [4.4 5.5 6.6]
 [7.7 8.8 9.9]]

可以通过多种方式优化此代码,但这应该足以让您继续前进。

【讨论】:

    【解决方案2】:

    我认为numpy.fromstring 函数完全符合您的要求。

    例如,np.fromstring('1 2', dtype=int, sep=' ') 调用返回此数组:array([1, 2])

    希望对你有帮助。

    【讨论】:

    • 这不是他的字符串的样子。
    猜你喜欢
    • 2013-05-05
    • 2016-03-10
    • 1970-01-01
    • 2021-04-26
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多