【问题标题】:Python reading X and Y values and assigning to Z specific X Y pairsPython 读取 X 和 Y 值并分配给 Z 特定的 X Y 对
【发布时间】:2013-06-25 05:40:10
【问题描述】:

我过去曾使用 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 值的行数,但我猜它不是很有效。 如果有人可以帮助我,我将不胜感激。 谢谢,

【问题讨论】:

    标签: python contour fromfile


    【解决方案1】:

    我假设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()
    

    【讨论】:

    • 谢谢。这已经给了我一个想法。但通常 N_x_values 不等于 N_y_values,(N_x_values 的值单独出现在第三行,N_y_values 的值单独出现在第四行,之后所有数据从 5 列开始)。值确实存储在 5 列中,但 N_x_values 或 N_y_values 不一定是 5 的倍数。但 X、Y 和 Z 的值之间总是存在变化的线。这就是我使用 linesx = np.ceil(xval/ 5) 等等,以确定它必须为每个变量读取的行数。
    • 嘿,我更改了代码,以便它可以接受所有内容。您只需要事先解析N_x_valuesN_y_values。代码所做的是一次解析所有数据并将其存储在大小为N_lines x 5 的数组中。然后它将这个数组展平,然后为您的xyz 数组分段。它实际上并不关心行的长度是多少,或者每行是否具有相同的列数。只要您先验地知道N_x_valuesN_y_values,它就可以正常工作。
    • 我一直在尝试在您发布脚本时运行该脚本,并进行了一些更改,但即使在阅读了文档页面等之后我也没有成功……抱歉再次询问。所以,在我的第一行有一个描述性字符串,在第二行有一个数字(不重要)第三行包含一个等于 X 值数量的数字,第四行包含一个等于 Y 值数量的数字从第五行开始是 X 值,然后是 Y 值,最后是 Z 值(Z 值的数量等于 N_x_values*N_y_values)。
    • 对不起,字符用完了...我首先遇到的一个错误是 N_x_values 和 N_y_values 不能迭代(那只是在一开始就发生)如果我评论那一行是你将值设置为 0,在行 N_x_values, N_y_values = ... 我得到“ValueError:需要多于 1 个值才能解压”...在我制作的许多其他版本上,我得到了其他的错误集这个帖子大了很多。抱歉,感谢您的帮助。
    • 脚本出错。请注意上面的第 7-8 行已更改。写的时候,我以为 N_x 和 N_y 在同一行,但我一定是被另一个问题弄糊涂了。我改变了那个。该修复程序应解决ValueError 问题。一种简单的调试方法是:1.) 在脚本顶部导入sys。 2.) 确保脚本分段工作。因此,从顶部开始,确保每个代码块都输出您认为应该输出的内容。例如,在第 7-8 行之后,键入 print N_x_values, N_y_values,然后键入 sys.exit()sys.exit() 将在此时停止脚本。
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2012-10-07
    相关资源
    最近更新 更多