1

過去にファイル内のデータのペアから 2D XY プロットを作成するために python を使用しましたが、ファイル内のデータから等高線図を作成する必要があります。ファイルは次のようになります。

<Descriptive string>
<some "random" number>
<number of X values:nx>
<Number of Y values:ny>
X1 X2 X3 X4 X5
X6 X7 X8 X9 X10
...
... Xnx
Y1 Y2 Y3 Y4 Y5
Y6 Y7 Y8 Y9 Y10
...
... Yny
Z(X1,Y1) Z(X1,Y2) Z(X1,Y3) Z(X1,Y4) Z(X1,Y5)
Z(X1,Y6) Z(X1,Y7) Z(X1,Y8) Z(X1,Y9) Z(X1,Y10)
...
... 
Z(X1,Yny) Z(X2,Y1) Z(X2,Y3) Z(X2,Y4) Z(X2,Y5)
...
...
Z(X2,Yny) ...
...
...
Z(Xnx,Yny)

これまでのところ、X と Y の値を読み取ることができましたが、Z の値でさえ、おそらく最も便利な形式ではありませんでしたが、Z1 が (X1,Y1) と一致するようにそれらを適切に割り当てることができませんでした。 Z2 は (X1,Y2) で、Zny までは (X1,Yny) で、最後は Znx*ny で (Xnx,Yny) になります。これが十分に明確であることを願っています...これまでのところ、これは私が持っているコードです:

import numpy as np

# Read from .dat file:
with open("trans_acrolein_ResWVFunAP1R12.dat", "r") as f:
    fl = f.readline()
    xnum = f.readlines()[2]
    ynum = f.readlines()[3]

# Initialize some variables to be lists.
xval = []
yval = []

# Read the values of the number of X and Y values.
for line in xnum:
    px = line.split()
    xval.append(int(px[0]))

for line in ynum:
    py = line.split()
    yval.append(int(py[0]))

linesx = np.ceil(xval/5.0)
linesy = np.ceil(yval/5.0)
linesz = np.ceil((xval*yval)/5.0)

with open("trans_acrolein_ResWVFunAP1R12.dat", "r") as f:
    for line in f:
        x = []
        y = []
        for element in line[4:3+linesx].split():
            x.append(element)
            for element in line[4+linesx:3+linesx+linesy].split():
                y.append(element)

すべての要素を連続して読み取る方法がわからないので、最初に X 値を持つ行の数、次に Y 値を持つ行、最後に Z 値を持つ行の数を数える方法を使用しましたが、それほど多くはないと思います効率的。誰かがこれで私を助けてくれれば、本当に感謝しています。ありがとう、

4

1 に答える 1

1

だと思いN_z_values = N_x_values * N_y_valuesます。各行に同じ数の値がある場合は、行を含むすべてのデータを一度に解析し、 に従って分割できるはずですN_x_values

たとえば、行ごとに5つの値がある場合、次のことができN_x_values = 27ますN_y_values = 28

import numpy as np
data = []
N_x_values, N_y_values = 0, 0
with open(file_name, 'r') as in_file:
    # skip 2 lines, grab N_X, grab N_Y
    [in_file.next() for _ in range(2)]
    N_x_values = int(in_file.next().strip())
    N_y_values = int(in_file.next().strip())

    for line in in_file:
        line = line.strip().split(' ')
        data.append(map(float, line))

data = np.array(data)
data = data.reshape(np.prod(data.shape))
x_cutoff = N_x_values
y_cutoff = N_y_values
x = data[:x_cutoff]
y = data[x_cutoff:y_cutoff]
z = data[y_cutoff:].reshape(N_x_values, N_y_values)

これで、値は次の形式の配列になります

x.shape = (27, )
y.shape = (28, )
z.shape = (27, 28)

matplotlib.pyplot.contourこれらの値を直接受け取ることができます。例えば

import matplotlib.pyplot as plt
f = plt.figure()
ax = f.add_suplot(111)
ax.contourf(x, y, z)
ax.colorbar()
plt.show()
于 2013-06-27T16:21:20.667 に答える