我目前正在我大学的一个项目中工作,在那里我可以获得有关患者心音的信息流。 Arduino Client正在测量患者心脏的声音,并通过LAN将数据发送到我的服务器。服务器解码数字字符串,并使用它使用matplotlib绘制图形。我的问题如下:
import socket
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import datetime
import sys
converter = lambda data: (data[0], data[1]/1023*5, data[2]/1000)
HOST = ''
PORT = 1236
address = (HOST, PORT)
fig, ax = plt.subplots()
plt.style.use('seaborn')
plt.tight_layout()
fig.show()
x, y = [], []
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((address))
s.listen(1)
conn, addr = s.accept()
with conn:
print(f"Connectet to Client {addr}")
try:
while True:
data = conn.recv(4096).decode("utf-8")
if data == "STOP":
break
else:
data_list = data.split(";")
for d in data_list:
data_point = d.split(",")
if len(data_point) > 3:
data_point = ''
else:
data_point_num = [float(i) for i in data_point]
print(type(data_point_num))
real_data = list(map(converter, data_point_num))
finally:
sys.exit()
如您所见,我正在尝试使用lambda表达式将声音电压转换为实际电压。但是,我收到了float不可下标的Traceback错误。有人可以帮助学生吗?
如果split()
函数令人困惑,那是因为客户端发送了一个包含三个值的字符串,并打包在更大的字符串中。示例:
b'0,765,18273;0,721,18274;0,750,18275;....'
以此类推。
如果您有关于我的项目的具体技巧,请这样做,因为我是Python的新手
答案 0 :(得分:0)
克里斯·道尔(Chris Doyle)是对的。您正在使用函数转换器将浮点列表传递给“地图”。该映射将迭代此列表的每个元素,每个元素都是一个float。但是,对于每个元素,函数转换器都将尝试对其下标,这就是为什么您会收到该错误的原因。我认为您的意思是这样的:
dbms.connector.bolt.address=0.0.0.0:7687
在此代码中,“ updated_data_list”是列表的列表。这将通过调用map传递给函数转换器,该映射会将函数转换器应用于'updated_data_list'中的每个列表。由于每个列表都是可下标的,因此应该可以避免该错误,并且我认为这是您原本要实现的目标(尽管如果您的任何数据点少于三个部分,这仍然会造成问题)。
答案 1 :(得分:0)
Python映射接收一个列表,并使用提供的功能处理每个元素。
例如:
bundle install
正确执行代码。
# Return square of x
def square(x):
return x**2
numbers = [13, 21, 39, 24, 100]
result = map(square, numbers)
print(list(result))
# same implementation using lambda
result = map(lambda x: x**2, numbers)
print(list(result))