質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

3219閲覧

matplotlibでのValue Error(配列の数が原因と思われます)

Hiro527

総合スコア27

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/03/11 14:27

編集2020/03/11 22:23

前提・実現したいこと

Python3で、matplotlibとnumpyを使ってグラフを生成、表示しようとしています。
並列処理にはconcurrent.futures.ThreadPoolExecutorを使っています。

発生している問題・エラーメッセージ

グラフを表示する部分(30行目、plt.plot(Time, SinU, label="Sin"))の部分で以下のようなエラーメッセージが出力されます。
配列の長さに関するエラーかと思っているのですが、一向に解決できません。
エラーメッセージは以下の通りです。(ユーザー名は******で伏せ字にしています。)

Traceback (most recent call last): File "c:\Users******.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\ptvsd_launcher.py", line 48, in <module> main(ptvsdArgs) File "c:\Users******.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 432, in main run() File "c:\Users******.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 316, in run_file runpy.run_path(target, run_name='__main__') File "C:\Python380\lib\runpy.py", line 262, in run_path return _run_module_code(code, init_globals, run_name, File "C:\Python380\lib\runpy.py", line 95, in _run_module_code _run_code(code, mod_globals, init_globals, File "C:\Python380\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "c:\Users******\Desktop\VVVF関係\Python\vvvf.py", line 116, in <module> Main() File "c:\Users******\Desktop\VVVF関係\Python\vvvf.py", line 30, in Main plt.plot(Time, SinU, label="Sin") File "C:\Python380\lib\site-packages\matplotlib\pyplot.py", line 2794, in plot return gca().plot( File "C:\Python380\lib\site-packages\matplotlib\axes\_axes.py", line 1665, in plot lines = [*self._get_lines(*args, data=data, **kwargs)] File "C:\Python380\lib\site-packages\matplotlib\axes\_base.py", line 225, in __call__ yield from self._plot_args(this, kwargs) File "C:\Python380\lib\site-packages\matplotlib\axes\_base.py", line 391, in _plot_args x, y = self._xy_from_xy(x, y) File "C:\Python380\lib\site-packages\matplotlib\axes\_base.py", line 269, in _xy_from_xy raise ValueError("x and y must have same first dimension, but " ValueError: x and y must have same first dimension, but have shapes (10001,) and (1,)

該当のソースコード

エラー部を<<<<で示しています。

Python3

1import matplotlib.pyplot as plt 2import numpy as np 3import sys 4import concurrent.futures 5 6 7def Main(): 8 Time = np.arange(0, 0.10001, 0.00001) # 分解能:10uSec 9 SinFreq = 100 # 変調波周波数 10 TriFreq = 100 # 搬送波周波数(キャリア周波数) 11 TriN = 20 # 三角波項数 12 13 with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: 14 SinU = executor.submit(MakeSin, Time, SinFreq, 0).result # U相サイン波生成 15 SinV = executor.submit(MakeSin, Time, SinFreq, 120).result # V相サイン波生成 16 SinW = executor.submit(MakeSin, Time, SinFreq, 240).result # W相サイン波生成 17 TriWave = executor.submit(Tri, Time, TriFreq, TriN).result # 三角波生成 18 with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: 19 PwmU = executor.submit(Pwm, SinU, TriWave, Time).result # U相PWM波生成 20 PwmV = executor.submit(Pwm, SinV, TriWave, Time).result # V相PWM波生成 21 PwmW = executor.submit(Pwm, SinW, TriWave, Time).result # W相PWM波生成 22 with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: 23 VvvfU = executor.submit(VVVF, PwmU, PwmV, Time).result # U相-V相間VVVF波形 24 VvvfV = executor.submit(VVVF, PwmV, PwmW, Time).result # V相-W相間VVVF波形 25 VvvfW = executor.submit(VVVF, PwmV, PwmU, Time).result # W相-U相間VVVF波形 26 27 # U相グラフ描画 28 plt.subplot(2, 6, 1) 29 plt.title("U Phase", fontsize=20) 30 plt.plot(Time, SinU, label="Sin")<<<<<<<<<<<<<<<<<<<< 31 plt.plot(Time, TriWave, label="Tri") 32 plt.legend(loc="lower right", fontsize=10) 33 plt.subplot(2, 6, 3) 34 plt.plot(Time, PwmU) 35 plt.plot(2, 3, 2) 36 plt.title("U-V", fontsize=20) 37 plt.plot(Time, VvvfU) 38 # V相グラフ描画 39 plt.subplot(2, 6, 4) 40 plt.title("V Phase", fontsize=20) 41 plt.plot(Time, SinV, label="Sin") 42 plt.plot(Time, TriWave, label="Tri") 43 plt.legend(loc="lower right", fontsize=10) 44 plt.subplot(2, 6, 6) 45 plt.plot(Time, PwmV) 46 plt.plot(2, 3, 5) 47 plt.title("V-W", fontsize=20) 48 plt.plot(Time, VvvfV) 49 # W相グラフ描画 50 plt.subplot(2, 6, 7) 51 plt.title("W Phase", fontsize=20) 52 plt.plot(Time, SinW, label="Sin") 53 plt.plot(Time, TriWave, label="Tri") 54 plt.legend(loc="lower right", fontsize=10) 55 plt.subplot(2, 6, 9) 56 plt.plot(Time, PwmW) 57 plt.plot(2, 3, 8) 58 plt.title("V-W", fontsize=20) 59 plt.plot(Time, VvvfW) 60 61 plt.show() 62 63 64def MakeSin(t, f, p): #サイン波生成関数(ラッパー) 65 # t: 時間(配列) 66 # f: 周波数 67 # p: 位相(Deg) 68 wave = [] # 波形 69 for i in t: 70 wave.append(Sin(i, f, p)) 71 return wave 72 73 74def Sin(t, f, p): #サイン波生成関数 75 # t: 時間(配列) 76 # f: 周波数 77 # p: 位相(Deg) 78 return np.sin(2 * np.pi * f * t + (p / 180 * np.pi)) 79 80def Tri(t, f, n): # 三角波生成関数 81 # t: 時間(配列) 82 # f: 周波数 83 # n: 項数(整数) 84 p = 0 # 合成波の元 85 c = 1 # カウンタ 86 for i in np.arange(1, 2 * n - 1, 2): 87 if c % 2 == 0: 88 p += (1/i**2) * Sin(t, f * i, 0) 89 else: 90 p -= (1/i**2) * Sin(t, f * i, 0) 91 c += 1 92 return 8/(np.pi**2)*p 93 94def Pwm(w1, w2, t): # PWM波生成関数 95 # w1: 波形1(配列) 96 # w2: 波形2(配列) 97 # t: 時間(配列) 98 wave = [] # 波形 99 for i in range(0, len(t)): 100 if w1[i] > w2[i]: 101 wave.append(1) 102 else: 103 wave.append(0) 104 return wave 105 106def VVVF(w1, w2, t): # VVVF波形生成関数 107 # w1: 波形1(配列) 108 # w2: 波形2(配列) 109 # t: 時間(配列) 110 wave = [] # 波形 111 for i in range(0, len(t)): 112 wave.append(w1[i] - w2[i]) 113 return wave 114 115if __name__ == "__main__": 116 Main() 117 sys.exit(0)

試したこと

VSCodeを使って該当箇所にブレークポイントを設けて配列の長さ(len)を確認したところ、TimeとSinUはいずれも10001でした。他の配列も10001でした。

補足情報(FW/ツールのバージョンなど)

Windows10 Pro 64bit
Python3.8.0
matplotlib 3.2.0
numpy 1.18.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

result は methodなので () が必要ですね。

誤:

Python

1SinU = executor.submit(MakeSin, Time, SinFreq, 0).result # U相サイン波生成


正:

Python

1SinU = executor.submit(MakeSin, Time, SinFreq, 0).result() # U相サイン波生成

同様の修正が10箇所必要となります。

result()は結果が返るまでブロックするので、毎回呼んでいたら、全く並列処理になっていないような気がしますが、それは置いておいて・・・・

投稿2020/03/12 00:29

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hiro527

2020/03/12 00:34

回答ありがとうございます。 グラフ描画のタイミングで.result()を使い、値を得るというやり方でも解決にはなるのでしょうか? 今は試すことができないので、後ほど試してみます。
magichan

2020/03/12 00:46

今回の場合は、とりあえず SinU_future = executor.submit(...) SinV_future = executor.submit(...) SinW_future = executor.submit(...) TriWave_future = executor.submit(...) のように submit() までを実行することで4つの処理を並列で走らせ、その後で SinU = SinU_future.result() SinV = SinV_future.result() SinW = SinW_future.result() TriWave = TriWave_future.result() のように結果を取得することで並列処理となるかと思います。
Hiro527

2020/03/12 02:17

ありがとうございます! magichanさんの方法でできました! 並列処理でかなり高速化できたので良かったです! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問