gpt4 book ai didi

Python读取X和Y值并分配给Z特定的XY对

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:33 25 4
gpt4 key购买 nike

我过去曾使用 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 = 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()

关于Python读取X和Y值并分配给Z特定的XY对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17347922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com