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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

719閲覧

ループ途中のNumpy配列を保存したいが、エラーが出てしまう。

ShibaSamo

総合スコア15

NumPy

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

Python 3.x

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

0グッド

0クリップ

投稿2022/01/30 22:30

前提・実現したいこと

python3.6を用いて数値計算を行い、その過程でループ途中のNumpy配列を保存したいと考えています。その際、np.loadtxtおよびsavetxtを使っているのですが、保存の際にエラーが出てしまいます。

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

C:\Users\USER\python\FDTD\シン・ELECTROMAGNETIC SIMULATION USING THE FDTD(202201 10より)\レーザーのシミュレーション\テスト\増幅の周波数特性測定\ローレンツ媒質導 入>python fd2d_sub_500cell.py 0%| | 2/4000 [00:04<2:44:14, 2.46s/it] Traceback (most recent call last): File "fd2d_sub_500cell.py", line 82, in <module> sz2 = np.loadtxt(os.path.join(dir2,'sz_field_{0}.txt').format(before_time)) File "C:\Users\USER\AppData\Local\Programs\Python\Python36\lib\site-packages\n umpy\lib\npyio.py", line 961, in loadtxt fh = np.lib._datasource.open(fname, 'rt', encoding=encoding) File "C:\Users\USER\AppData\Local\Programs\Python\Python36\lib\site-packages\n umpy\lib\_datasource.py", line 195, in open return ds.open(path, mode, encoding=encoding, newline=newline) File "C:\Users\USER\AppData\Local\Programs\Python\Python36\lib\site-packages\n umpy\lib\_datasource.py", line 535, in open raise IOError("%s not found." % path) OSError: sz/sz_field_1.txt not found.

該当のソースコード

以下はソースコードです。
szの初期値は全要素が0の500x500のNumpy配列です。

python3.6

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4""" 5fd2d 細々といじる用 6""" 7 8import os 9import numpy as np 10from math import pi, sin, cos, exp, sqrt 11from matplotlib import pyplot as plt 12from mpl_toolkits.mplot3d.axes3d import Axes3D, get_test_data 13from tqdm import tqdm 14 15import fd2d_init_value as fi 16 17# データ用のファイル作成 18os.mkdir('data') 19os.mkdir('sz') 20 21# ディレクトリ指定用 22dir1 = 'data/' 23dir2 = 'sz/' 24 25# 初期時間 26tau = 20 27 28# 周波数対強度のリスト 29amp = [] 30 31# 強度計算用の配列(実部と虚部) 32re_ez = [] 33im_ez = [] 34 35# 特定の点を入れておくためのリスト 36point_x = range(1, fi.nsteps + 1) 37point_y = [] 38 39# 補助項の定義 40sz = fi.sz 41sz2 = np.zeros((fi.ie, fi.je)) 42 43# 各パラメータの読み込み 44epsr = fi.epsr 45delta0 = fi.delta0 46f0 = fi.f0 47omega0 = fi.omega0 48eps1 = fi.eps1 49 50# 対数スケールの配列作成 51start = 10^6 52stop = 10^10 53freq_list = np.logspace(start,stop) 54 55# 補助項の係数の計算 56base = 1 + fi.dt * delta0 * omega0 57top1 = 2 - (fi.dt**2) * (omega0**2) 58top2 = 1 - (fi.dt * delta0 * omega0) 59top3 = (fi.dt**2) * (omega0**2) * eps1 60 61# Main FDTD Loop 62for time_step in tqdm( range(1, fi.nsteps + 1) ): 63 64 # Calculate the Dz field 65 for j in range(1, fi.je): 66 for i in range(1, fi.ie): 67 fi.dz[i, j] = fi.gi3[i] * fi.gj3[j] * fi.dz[i, j] + fi.gi2[i] * fi.gj2[j] * 0.5 * (fi.hy[i, j] - fi.hy[i - 1, j] - fi.hx[i, j] + fi.hx[i, j - 1]) 68 69 # Source1 70 if abs(time_step - tau*3) < tau*3: 71 gause_pulse = ( exp( - ( time_step - tau*3 ) **2 / tau ) ) 72 fi.dz[250][250] = gause_pulse 73 74 else: 75 continue 76 77 #補助項Sの2ステップ前の読み込み 78 if time_step < 3: 79 continue 80 else: 81 before_time = time_step - 2 82 sz2 = np.loadtxt(os.path.join(dir2,'sz_field_{0}.txt').format(before_time)) 83 84 # 補助項Sの計算 85 for i in range(fi.mir_y_bey, fi.mir_y_ove): 86 for j in range(fi.mir_x_sta, fi.mir_x_fin): 87 sz[i,j] = (sz[i,j] * top1 / base) - (sz2[i,j] * top2 / base) + (fi.ez[i,j] * top3 / base) 88 89 # Sの保存 90 np.savetxt(os.path.join(dir2,'sz_field_{0}.txt').format(time_step), sz) 91 92 # Calculate the Ez field 93 for j in range(0, fi.je): 94 for i in range(0, fi.ie): 95 fi.ez[i, j] = (fi.dz[i, j] - sz[i,j]) / epsr 96 97 # Calculate the Hx field 98 for j in range(0, fi.je - 1): 99 for i in range(0, fi.ie - 1): 100 curl_e = fi.ez[i, j] - fi.ez[i, j + 1] 101 fi.ihx[i, j] = fi.ihx[i, j] + curl_e 102 fi.hx[i, j] = fi.fj3[j] * fi.hx[i, j] + fi.fj2[j] * (0.5 * curl_e + fi.fil[i] * fi.ihx[i,j]) 103 104 # Calculate the Hy field 105 for j in range(0, fi.je - 1): 106 for i in range(0, fi.ie - 1): 107 curl_e = fi.ez[i, j] - fi.ez[i + 1, j] 108 fi.ihy[i, j] = fi.ihy[i, j] + curl_e 109 fi.hy[i, j] = fi.fi3[i] * fi.hy[i, j] - fi.fi2[i] * (0.5 * curl_e + fi.fjl[j] * fi.ihy[i,j]) 110 111 # 強度分布の計算 112 for i, freq in enumerate(freq_list): 113 arg = 2 * pi * freq * fi.dt * time_step 114 re_ez[i] = re_ez[i] + cos( arg ) * fi.ez[300][300] 115 im_ez[i] = im_ez[i] - sin( arg ) * fi.ez[300][300] 116 amp[i] = sqrt( (re_ez[i]) **2 + (im_ez[i]) **2 ) 117 118 point_y.append(fi.ez[fi.ie - 30, fi.je - 30]) 119 120 if time_step % 100 ==0: 121 e_field = np.copy(fi.ez) 122 np.savetxt(os.path.join(dir1, 'e_result_{0}.txt'. format(time_step)), e_field) 123 e_center = np.copy(fi.ez[:,250]) 124 np.savetxt(os.path.join(dir1, 'e_center_{0}.txt'. format(time_step)), e_center) 125 126 else : 127 continue 128 129f = open('a_point_list(raw).txt', 'w') 130for x in point_y: 131 f.write(str(x) + "\n") 132f.close() 133 134f = open('freq_vs_amp.txt', 'w') 135for x in amp: 136 f.write(str(x) + "\n") 137f.close() 138 139# 特定の点の変化を表すグラフの作成 140fig = plt.figure(figsize=(8, 8)) 141ax = fig.add_subplot(1,1,1) 142ax.plot(point_x, point_y) 143 144fig.tight_layout() 145plt.savefig("point_vary.png")

試したこと

savetxtと.formatの相性が悪いのかと思い、書き方をいくつか変更してみましたが動きませんでした。ディレクトリ指定の方法が間違っているのかとも思ったのですが、何度確認しても間違いが見つけられませんでした。

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

numpy 1.19.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

理由を知りたければ、savetxtとloadtxtの前に、ファイル名を表示するコードを入れておいて動かしてください。

例えば、

# Sの保存 np.savetxt(os.path.join(dir2,'sz_field_{0}.txt').format(time_step), sz)

の部分に以下のprint文を追加するなどです。

# Sの保存 print(os.path.join(dir2,'sz_field_{0}.txt').format(time_step)) np.savetxt(os.path.join(dir2,'sz_field_{0}.txt').format(time_step), sz)

投稿2022/01/31 00:16

ppaul

総合スコア24666

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

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

ShibaSamo

2022/01/31 04:15

ppaul様の助言通り、print文を追加してみたところ、「print文があるのに文が表示されない」という結果になりました。無学で恐縮なのですが、特定の関数はループ中では異なる挙動をするということなのでしょうか?
ppaul

2022/01/31 08:16

「print文があるのに文が表示されない」というのは、print文が実行されると期待しているのに、実際は実行されていないという場合が多いです。その原因は、if文の条件が間違っているとか、for文で回しているつもりなのに実は回転数がゼロだったりします。if文の前やfor文の前に、そういう情報を出力するようなprint文を入れてみてください。
ShibaSamo

2022/01/31 11:50

ありがとうございます! 基本を忘れてしまっていました。 ループ中のcontinueをpassにすることで問題を解消することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問