簡體   English   中英

Python讀取X和Y值並分配給Z特定的XY對

[英]Python reading X and Y values and assigning to Z specific X Y pairs

我過去使用python從文件中的數據對創建2D XY圖,但是現在我需要從文件中的數據創建輪廓圖。 該文件如下所示:

<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值的行數,但我想它不是很高效。 如果有人可以幫助我,我將非常感激。 謝謝,

我假設N_z_values = N_x_values * N_y_values 如果每行上的值數量相同,那么您應該能夠一次解析所有包含行的數據,然后根據N_x_values對其進行N_x_values

例如,如果N_x_values = 27N_y_values = 28並且每行有5個值,那么您可以

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM