在Python 3中将逗号分隔字符串转换为Numpy数组

在Python 3中将逗号分隔字符串转换为Numpy数组,python,numpy,pyqtgraph,Python,Numpy,Pyqtgraph,我正在使用Python从Arduino传感器读取数据,在Python3中使用PySerial 我想使用PyQtGraph绘制数据,因此我尝试将从传感器读取的字符串(288个逗号分隔的值)转换为Numpy数组。然而,我尝试了两种不同的方法,但都没有成功 从传感器读取此代码非常有效: #Read the line of data from the sensor line = sensor.readline() #Decode the line to UTF-8 and print it lineD

我正在使用Python从Arduino传感器读取数据,在Python3中使用PySerial

我想使用PyQtGraph绘制数据,因此我尝试将从传感器读取的字符串(288个逗号分隔的值)转换为Numpy数组。然而,我尝试了两种不同的方法,但都没有成功

从传感器读取此代码非常有效:

#Read the line of data from the sensor
line = sensor.readline()

#Decode the line to UTF-8 and print it
lineDecoded = line.decode("UTF-8")

print(lineDecoded)
这提供了正确的输出(288个逗号分隔的值):

13713615114514113313131313914014514413914314314113913913613713813712714213513613713414012714113413913513618014914715115614015314314315516316192250272722752582258224824523125225195159186175168171173177185213222212272122923123125025322626269274277,27,276,272,291,303,351,417,483,500,473,399,315,263,255,239,238,244,234,231,231,242,255,272,294,293,299,314,307,306,302,310,319,304,312,327,370,464,507,514,492,425,358,327,313,299,292,291,281,259,245,232,229,224,223,222,216,226,215,211,197,202,199,197,198,193,198,185,190,196,177,198,188,183,201,193,187,159,189,184,186,185,186,185,184,196,195,200,201,198,193,241,189,186,167,179,187,174,188,180,179,169,177,173,172,175,181,175,171,180,175,176,180,184,176,190,182,172,171,179,178,174,188,175,178,167,183,171,168,174,175,171,230,175,177,159,177,170,172,171,173,168,167,169,172,168,171,177,173,167,167,171,163,170,177,172,169,167,163,157,173,161,168,174,162,165,171,165,162,152,165,173,158,193,161,161,147,15916115916917316815816115915817116716715515916915615916251615916215715161158147161171159

从那里开始,我想我就可以将
lineDecoded
传递给PyQtGraph的
plot
函数,但是在运行这行代码之后

x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288]

y = [lineDecoded]

#Plot the data
pg.plot(x, y)
我得到了错误
异常:X和Y数组必须是相同的形状--get(288,)和(1,)。

在将字符串传递到PyQtGraph之前,我尝试使用各种方法转换字符串,如
np.fromstring(lineDecoded)
np.array(list(lineDecoded)).ravel()
,但我尝试过的方法都不起作用

关于如何做到这一点有什么想法吗

编辑:我已经浏览了所有答案,但似乎没有一个有效,每个答案的评论中都有详细信息。任何提示都很好。

line.decode()
返回字符串(a
str
),而不是
列表。因此,返回的是单个实体,而不是288个值

lineDecoded = [137,136,151,145,141,133,145,139,140,145,144,139,143,141,139,136,137,138,137,127,142,135,136,137,134,140,127,141,134,128,139,135,136,180,149,147,147,151,156,140,153,143,143,155,163,164,192,250,277,282,275,258,258,248,245,231,215,225,195,195,159,186,175,168,171,173,177,185,213,224,228,231,227,219,261,229,231,231,250,253,262,276,269,274,274,277,276,272,291,303,351,417,483,500,473,399,315,263,255,239,238,244,234,231,231,242,255,272,294,293,299,314,307,306,302,310,319,304,312,327,370,464,507,514,492,425,358,327,313,299,292,291,281,259,245,232,229,224,223,222,216,226,215,211,197,202,199,197,198,193,198,185,190,196,177,198,188,183,201,193,187,159,189,184,186,185,186,185,184,196,195,200,201,198,193,241,189,186,167,179,187,174,188,180,179,169,177,173,172,175,181,175,171,180,175,176,180,184,176,190,182,172,171,179,178,174,188,175,178,167,183,171,168,174,175,171,230,175,177,159,177,170,172,171,173,168,167,169,172,168,171,177,173,167,167,171,163,170,177,172,169,167,163,157,173,161,168,174,162,165,171,165,162,152,165,173,158,193,161,161,147,159,161,159,169,173,168,158,161,159,158,171,167,167,155,159,169,156,159,162,157,165,161,158,147,161,171,159]

x = range(1,289)
import matplotlib.pyplot as plt
plt.plot(x, lineDecoded)
Python有一个与字符串关联的方法,该方法将获取一个字符串并将其拆分为组件部分。调用
.split()
方法并为其提供要拆分的子字符串,在本例中,一个“,”就可以做到这一点

#Read the line of data from the sensor
line = sensor.readline()

#Decode the line to UTF-8 and print it
lineDecoded = line.decode("UTF-8")


values = [int(i) for i in lineDecoded.split(',')]    # <<< this should work
                                                     # added a list
                                                     # comprehension to 
                                                     # convert values to integers


x = range(1,289)                   # <<< this is preferred if you need 
                                   # a range of numbers from 1 to 288

y = values

#Plot the data
pg.plot(x, y)
使用将行转换为字符串列表的方法。正如@Alien所建议的,您应该使用函数获取
x
,而不是手动枚举所有值

y = [int(i) for i in lineDecoded.split(',')]
x = range(1,289)

import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot(x, lineDecoded)
fig.show()

通过复制/粘贴字符串:

In [341]: astring="""137,136,151,145,141,133,145,139,140,145,144,139,143,141,139
     ...: ,136,137,138,137,127,142,135,136,137,134,140,127,141,134,128,139,135,1
     ...: 36,180,149,147,147,151,156,140,153,143,143,155,163,164,192,250,277,282
     ...: ...
,147,159,161,159,169,173,168,158,161,159,158,171,167,167,155,159,169,1
     ...: 56,159,162,157,165,161,158,147,161,171,159"""
split(',')
生成字符串列表。如果我将其包装在
np.array
中,我会得到一个字符串数组:

In [342]: np.array(astring.split(','))
Out[342]: 
array(['137', '136', '151', '145', '141', '133', '145', '139', '140',
       ...
       '162', '157', '165', '161', '158', '147', '161', '171', '159'], 
      dtype='<U3')
第一次尝试时,字符串以逗号结尾:
8147161171159,
。然后,拆分包含一个空字符串,
np.array
无法转换为整数。我把它删掉了。我还可以将其从索引字符串列表中删除,
[:-1]

如果它可以将字符串列表(拆分后)传递给plot函数,那是因为该函数执行了相同类型的
np.array(…,int)
(或float)转换

[int(i) for i in astring.split(',')]

可用于创建整数列表

您可以打印y并键入(y)以及输出内容吗?您可以将其拆分为一个列表,然后再拆分为一个numpy.array,
y=np.array(lineDecoded.split(“,”)
)。但实际上不必。您可以将其用作打印列表。谢谢-我使用了您关于拆分函数的建议,得到了
类型错误:无法使用灵活类型pyqtgraph执行reduce
,因此我将代码修改为
lineDecoded=lineDecoded[:-2]
(以删除额外数字)和
yValues=lineDecoded.split(“,”)
y=np.array(yvalue).astype(np.int)
。错误消息现在消失了,但PyQtGraph弹出窗口在打开时崩溃,不显示任何数据。你知道为什么会发生这种情况吗(在Jupyter中)?@AggroCrag的问题:你能用简单、定义良好的数据生成一个简化版本的图吗?i、 在pg.plot(x,y)中输入每个人的简短列表:x=[1,2,3]y=[5,6,7]我经常通过创建众所周知的数据来找出问题的根源,看看这是否有效。如果是这样的话,我就开始查看我的真实数据。如果没有,那么我开始查看我的实现(即Jupyter是否设置为显示PyQtGraphs等)。对不起,我不能说得更具体了。注意:我们的答案在解决最初提出的问题时似乎令人满意。我继续使用了您提到的代码,为该简单数据集弹出的Python窗口也崩溃了。一定是我这边的系统问题。谢谢谢谢-我在Jupyter笔记本中尝试了您的方法,但它抛出了错误
matplotlib当前使用的是非GUI后端
。我试图用以下代码更改后端:
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt'但它抛出错误“UserWarning:此调用matplotlib.use()无效,因为后端已被选中。”。我是否需要放弃Jupyter才能让您的方法工作?根据您初始化Jupyter笔记本的方式,matplotlib后端可能已经设置好了。如果是这种情况,再次尝试设置会导致此错误。这段对话,虽然是针对Spyder的,但描述了你的Jupyter笔记本发生了什么。是的,我想我不能改变Jupyter的后端。。。我会坚持PyQ
In [343]: np.array(astring.split(','),int)
Out[343]: 
array([137, 136, 151, 145, 141, 133, 145, 139, 140, 145, 144, 139, 143,
       141, 139, 136, 137, 138, 137, 127, 142, 135, 136, 137, 134, 140,
...., 165, 161, 158, 147, 161,
       171, 159])
In [344]: _.shape
Out[344]: (288,)
[int(i) for i in astring.split(',')]