1

私はPythonにかなり慣れていないので、.txtファイルからデータを読み取り、ユーザー情報を求める4点線形補間を行うプログラムを作成しようとしています。

.txt ファイルには、次の形式の表に温度と圧力が含まれています。

T    P1  P2  P3  P4
     80,100,150,200
75,  400,405,415,430
100, 450,456,467,483
150, 500,507,519,536
200, 550,558,571,589

コードは次のとおりです。

# User input
temp = input("Enter temperature value in degrees Celcius [Range: 75-200]:")
pressure = input("Enter pressure value in bars [Range: 80-589")

temp = float(temp)
pressure = float(pressure)

# Opens file and read data
filename = open('xxxxxxxxxxxxx.txt', 'r').readlines()

# Removes \n from each line
for i in list(range((len(filename)-1))):
    filename[i] = filename[i][:-1]

# Splits string
for i in list(range(len(filename))):
    filename[i] = filename[i].split(',')

# Converts string numbers into decimal numbers
for i in [2,3,4,5,6]:
    filename[i][0] = float(filename[i][0])
    filename[i][1] = float(filename[i][1])

ここからどこへ行けばいいのかわからない。ユーザー入力が T=100 および P=200 であった場合、これらの数値の直前と直後にあるファイルからデータ ポイントを見つけるにはどうすればよいでしょうか?

もちろん、私は自分が何をしているのかあまり知りませんが、助けていただければ幸いです。

ETA: 実際のテーブル値。また、実際の問題文についても明確ではありませんでした。温度と圧力が与えられると、プログラムは U (内部エネルギー) を見つけるために線形補間を実行する必要があります。T 値は最初の列、P 値は最初の行、残りは U 値です。

4

3 に答える 3

2

ここには 2 つの個別の質問があります。Python / NumPy にデータを読み込む方法と、2 次元補間を行う方法です。
データの読み取りには numpy loadtxtを、
補間には scipy BivariateSplineをお勧めします。(どちらも必要以上のオプションがあります。)

from __future__ import division
from cStringIO import StringIO
import numpy as np
from scipy.interpolate import RectBivariateSpline

np.set_printoptions( 1, threshold=100, edgeitems=10, suppress=True )

    # a file inline, for testing --
myfile = StringIO( """
# T  P1  P2  P3  P4
0,   80,100,150,200

75,  400,405,415,430
100, 450,456,467,483
150, 500,507,519,536
200, 550,558,571,589
""" )

    # file -> numpy array --
    # (all rows must have the same number of columns)
TPU = np.loadtxt( myfile, delimiter="," )
P = TPU[0,1:]  # top row
T = TPU[ 1:,0]  # left col
U = TPU[1:,1:]  # 4 x 4, 400 .. 589
print "T:", T
print "P:", P
print "U:", U

interpolator = RectBivariateSpline( T, P, U, kx=1, ky=1 )  # 1 bilinear, 3 spline

    # try some t, p --
for t, p in (
    (75, 80),
    (75, 200),
    (87.5, 90),
    (200, 80),
    (200, 90),
    ):
    u = interpolator( t, p )
    print "t %5.1f  p %5.1f -> u %5.1f" % (t, p, u)

ちなみに、インタラクティブなpythonの場合、 IPython を使用すると、単一行を試したり、変数を調べたりするのが簡単になります...

于 2012-05-05T16:33:09.023 に答える
0
  1. を使用.readlines()すると、ファイルが大きくなるとすぐに足を撃ちます。あなたは何をする必要があるかを定式化できますか?

    for line in open(...):
        # parse line
    

    ファイルをメモリに完全にロードせずに一度だけ解析します。

    • さらに良いのは、withファイルを操作するときにイディオムを使用することです。

      with open(...) as file:
          for line in file:
              # parse line
      

      これにより、ファイルの操作中に問題が発生した場合の頭痛の種が少し軽減されます。

  2. float()文字列からフロートを作成するために使用することになる場合は、改行を削除する必要はありません。float('1.2 \t\n')完全に有効なコードです。

  3. for i in list(range(len(filename))):

    これはスタイルが悪い。リストを反復処理するための Python のイディオムは次のとおりです。

    for element in list:
    

    リストへのインデックスが必要な場合は、使用する必要があります

    for i, element in enumerate(list):
    

    あなたのアプローチは一種の「手動」であり、機能しますlistが、listrange(...)python 2.xからの)から作成することは完全に不要です。コードに代わるより良い「手動」の代替手段は次のとおりです。

    for i in xrange(len(filename)):
    

    ただし、上記のイディオムよりもはるかに読みにくいです。

コードのバッシングが終わったので、主な質問は次のとおりです。実際に何をする必要があるのでしょうか。解決しようとしている問題の正確な仕様を一言一句教えていただけますか?

  • http://en.wikipedia.org/wiki/Linear_interpolationを見ましたか?
  • あなたの場合、端末からの入力データの意味は何ですか?
  • 端末からの入力データの直前と直後にあるファイルからのデータが必要な理由と目的は何ですか?
  • 温度/圧力データは何らかの方法でソートされていますか?
  • ファイル内の行は何を表していますか (たとえば、時間ベース、場所ベース、またはその他のもの)?
  • 4つの異なる圧力は何を表していますか?
于 2012-05-03T04:52:12.180 に答える