2017-04-19 5 views
0

センサーから読み込まれた文字列(288カンマ区切りの値)をNumpy配列に変換します。しかし、私はいくつかの方法を試してみましたが、うまく動作しませんでした。3私はPyQtGraphを使用してデータをプロットしたいのPython 3</p> <p>でPySerialを使用してArduinoのセンサーからデータを読み取るためのPythonを使用していますので、私がしようとしています

センサーからの読み出しはこのコードの素晴らしい作品:私は正しい出力(288カンマ区切り値)を与える

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

:そこから

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) 

私は、様々なnp.fromstring(lineDecoded)np.array(list(lineDecoded)).ravel()のような方法が、私は仕事をしようとした方法のどれを使用してPyQtGraphに渡す前に、文字列を変換しようとしたエラーException: X and Y arrays must be the same shape--got (288,) and (1,).

を得ました。

どのようにこれを達成することができますか?

編集:私は答えを見てきましたが、いずれも反応していないようですが、回答ごとのコメントの詳細はありません。どんなヒントも素晴らしいだろう。

+0

印刷して(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

ありがとうございました - 私はsplit関数に関するあなたのアドバイスを使用して、 'TypeError:柔軟な型pyqtgraph'でreduceを実行できないので、コードを' lineDecoded = lineDecoded [: - 2] '(余分な数字を削除する)と' yValues = lineDecoded.split( "、") "' y = np.array(yValues).astype(np.int) '。エラーメッセージは消えましたが、PyQtGraphポップアップウィンドウは開いたときにクラッシュし、データを表示しません。これがどうして起こるのか(Jupyter)? – AggroCrag

+0

@AggroCragの質問:簡単で明確に定義されたデータを使って作成しようとしているグラフの簡略版を作成できますか?私はしばしば作成することにより、私の問題の原因を見つける X = [1、2、3] Y = [5、6、7] : すなわちpg.plotに(x、y)の各々についての短いリストを養いますそれが機能するかどうかを知るためのよく知られたデータです。もしそうなら、私は自分の実際のデータを見始める。そうでない場合は、私の実装を見ていきます(つまり、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

文字列のlistに行を変換するためのstr.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ノートブックであなたのメソッドを試しました、そして 'matplotlibは現在非GUIバックエンドを使っています.'というエラーを投げました。私は、次のコードでバックエンドを変更しようとしました: 'import matplotlib' ' matplotlib.use( 'TkAgg') ' ' import matplotlib.pyplotをplt 'としましたが、' UserWarning:this call to matplotlib.use( )は、バックエンドが既に選択されているので効果がありません。私はあなたの方法を働かせるためにジュピターを捨てる必要がありますか? – AggroCrag

+0

ジュピターノートブックの初期化方法によっては、matplotlibバックエンドが既に設定されている可能性があります。この場合、再度設定しようとするとこのエラーが発生します。この会話は、Spyderにもかかわらず、Jupyter Notebookで何が起こっているのかを説明します。 https://groups.google.com/forum/#!topic/spyderlib/tRwgqEAIyvs –

+0

ええ、私はジュピターのバックエンドを変更できないと思います...私は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

関連する問題

 関連する問題