2017-04-19 47 views
0

我使用Python來從在Python 3.轉換逗號分隔的字符串到numpy的陣列在Python 3

使用PySerial我要繪製使用PyQtGraph數據一個Arduino傳感器讀出的數據,所以我試圖將從傳感器讀取的字符串(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逗號分隔值):

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,

從那裏,想我會只是能夠通過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) 

我得到了錯誤Exception: X and Y arrays must be the same shape--got (288,) and (1,).

我嘗試使用像np.fromstring(lineDecoded)np.array(list(lineDecoded)).ravel()但沒有我試過的工作方法,各種方法將它傳遞給PyQtGraph之前轉換的字符串。

關於如何完成這個任何想法?

編輯:我已經經歷了答案,他們似乎都沒有工作,每個回覆的評論中的細節。任何提示都會很棒。

+0

你可以做一個打印y和輸入(y),輸出是什麼? – Allen

+0

你可以將它分割成一個列表,然後分割成一個numpy.array,'y = np.array(lineDecoded.split(「,」))'。但是,並不一定要將它用作繪圖列表。 – umutto

回答

1

line.decode()返回一個字符串,而不是一個列表。所以你回來了一個單一的實體,而不是288個值。

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) 

注:如@umutto提到了上述評論,密謀目的,應該沒有必要的值轉換爲numpy的陣列。列表應該沒問題。

但是,如果由於某種原因,你會發現你想/需要一個數組: Y = np.array(值)

+0

謝謝 - 我用你的建議在分裂功能,並得到了'TypeError:不能執行減少與靈活類型pyqtgraph',所以我修改了'lineDecoded = lineDecoded [: - 2]'(刪除多餘的數字)和'yValues = lineDecoded.split(「,」)''y = np.array(yValues).astype(np.int)'。錯誤信息現在消失了,但PyQtGraph彈出窗口在打開時崩潰並且不顯示任何數據。任何想法爲什麼會發生(在Jupyter)? – AggroCrag

+0

@AggroCrag的問題:您可以使用簡單的,定義明確的數據來生成您試圖生成的圖的簡化版本嗎? 即飼料到pg.plot(x,y)每個短列表: x = [1,2,3] y = [5,6,7] 我經常通過創建我的問題的來源衆所周知的數據,看看是否有效。如果是這樣,那麼我開始看看我的真實數據。如果沒有,那麼我開始看看我的實現(即Jupyter設置爲顯示PyQtGraphs等等)。 對不起,我不能更具體。 注意:我們的答案在解決提出的原始問題方面似乎令人滿意。 –

+0

我繼續前進並使用您提到的代碼,並且彈出該簡單數據集的Python窗口也崩潰了。必須是我的一個系統問題。謝謝! – AggroCrag

0
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) 
1

使用的線轉換爲字符串的liststr.split方法。同樣如@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() 
+0

謝謝 - 我在Jupyter Notebook中試過了你的方法,並且拋出了'matplotlib當前正在使用非GUI後端'的錯誤。我嘗試用以下代碼更改後端:'import matplotlib' 'matplotlib.use('TkAgg')' 'import matplotlib.pyplot as plt'但它引發錯誤'UserWarning:This call to matplotlib.use )沒有效果,因爲後端已經被選中了。我需要拋棄Jupyter來讓你的方法起作用嗎? – AggroCrag

+0

根據初始化Jupyter Notebook的方式,matplotlib後端可能已經設置好了。如果是這種情況,嘗試再次設置會導致此錯誤。這次對話雖然是Spyder,但描述了Jupyter筆記本電腦正在發生的事情。 https://groups.google.com/forum/#!topic/spyderlib/tRwgqEAIyvs –

+0

是的,我想我無法更改Jupyter上的後端...我會堅持使用PyQtGraph。謝謝 – AggroCrag

1

隨着你的字符串的複製/粘貼:

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') 

我需要告訴它的字符串轉換爲整數:

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,) 

我第一次嘗試它,字符串結束用逗號分隔:"8,147,161,171,159,"。然後拆分包含一個空字符串,其中np.array不能轉換爲整數。我編輯了出來。我也可以從索引編號爲[:-1]的字符串列表中刪除它。

如果它能夠將字符串列表(分割後)傳遞給繪圖函數,那是因爲該函數執行了相同類型的np.array(..., int)(或float)轉換。

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

可以用來創建一個整數列表。

+0

感謝有關索引的信息。使用'[:-2]'允許我在最後修剪掉換行符和逗號。我用你的建議將字符串轉換爲整數(正如在對@E.Ducateme的迴應中所提到的),但我仍然無法打開一個可用的Python窗口來顯示PyQtGraph圖並且不會崩潰。 – AggroCrag

+0

'numpy'用戶比'PyQtGraph'更有可能使用'matplotlib'進行繪圖。你可能需要問一個單獨的「PyQtGraph」問題,重點在於使該包能夠工作。 – hpaulj

相關問題