【问题标题】:How to extract data and append it into np.arrays如何提取数据并将其附加到 np.arrays
【发布时间】:2021-12-06 11:25:08
【问题描述】:

我正在尝试学习如何使用 np.arrays,作为一项练习任务,我正在开发一个程序,该程序从文件中读取数据并将其添加到一些数组中。

函数 read_from_file() 应该返回一些包含排序数据点的数组,以便可以使用 matplot lib 轻松绘制它们。

目前我写的代码是

import numpy as np
import matplotlib.pyplot as plt

def read_from_file(filename):

    a = np.array
    b = np.array
    c = np.array
    d = np.array


    with open(filename, "r") as infile:
        infile.readline()
        for line in infile:
            infile.readline()
            delta_x = float(line[9:21].strip())
            approx = float(line[34:50].strip())
            abs_error = float(line[91:103].strip())
            relative_error = float(line[121:133].strip())
            n_ = int(line[137:].strip())

            a = np.append(delta_x)
            b = np.append(approx)
            c = np.append(abs_error)
            d = np.array(relative_error)

    return a, b, c, d

test = read_from_file("datafile.txt")

我试图读取的数据文件看起来像这样(我只关心每一行)

0.1 0.045590188541076104
delta_x: 1.000000e-01, df_approx: 4.5590188541e-01, df_exact: 5.0000000000e-01, abs_error: 4.409811e-02,           rel_error: 8.819623e-02, n=1
0.01 0.00495661575773676
delta_x: 1.000000e-02, df_approx: 4.9566157577e-01, df_exact: 5.0000000000e-01, abs_error: 4.338424e-03,           rel_error: 8.676848e-03, n=2
...................................
delta_x: 1.000000e-18, df_approx: 0.0000000000e+00, df_exact: 5.0000000000e-01, abs_error: 5.000000e-01,           rel_error: 1.000000e+00, n=18
1e-19 0.0
delta_x: 1.000000e-19, df_approx: 0.0000000000e+00, df_exact: 5.0000000000e-01, abs_error: 5.000000e-01,           rel_error: 1.000000e+00, n=19

我的问题是 我想我正在设法按预期提取数据(在列表等上进行了测试)。但是当我尝试将它添加到 np.arrays 时,它给了我这个错误消息:

Traceback (most recent call last):
  File "C:/(...).py", line 55, in <module>
    test = read_from_file("datafile.txt")
  File "C:/(...).py", line 48, in read_from_file
    a = np.append(delta_x)
  File "<__array_function__ internals>", line 4, in append
TypeError: _append_dispatcher() missing 1 required positional argument: 'values'

我的问题是:

  1. 有没有好心人为我提供这个问题的解决方案?
  2. 如何将数据添加到 np.arrays(有点像您使用列表的方式)
  3. 向 np.arrays 添加数据的最佳方式是什么
  4. 如果我想使用 for 循环遍历数组(有点像使用列表的方式),最好的方法是什么?

所有帮助都非常受欢迎和高度赞赏

【问题讨论】:

  • 不要将数组视为列表。这会给你带来很多问题。
  • 您是否花时间阅读numpy for absolute beginners 文档?
  • np.append docs 两次说它返回一个 copy,这与就地工作的列表追加不同。正确的做法是构建列表,并从中创建一个数组。
  • @hpaulj:请为您提供反馈。我现在已经根据您提供的改进和建议更新了我的代码。

标签: python arrays numpy for-loop


【解决方案1】:
  1. 要创建一个空的numpy数组(当你不知道最终的形状时),你应该使用np.array([])
  2. np.append 接受两个参数:要附加到的数组和要附加的值。你只通过了一个。
  3. enumerate 覆盖文件,因此您只能解析您实际需要的行。

试试:

def read_from_file(filename):
    a = np.array([])
    b = np.array([])
    c = np.array([])
    d = np.array([])
    
    with open(filename) as infile:
        for i, line in enumerate(infile):
            if i%2 == 0:
                continue
            contents = line.split(", ")
            values = [c.split(":")[-1].strip() for c in contents]
            a = np.append(a, float(values[0]))
            b = np.append(b, float(values[1]))
            c = np.append(c, float(values[2]))
            d = np.append(d, float(values[3]))
    return a,b,c,d

a, b, c, d = read_from_file("file.txt")

>>> a
array([1.e-01, 1.e-02, 1.e-18, 1.e-19])

>>> b
array([0.45590189, 0.49566158, 0.        , 0.        ])

>>> c
array([0.5, 0.5, 0.5, 0.5])

>>> d
array([0.04409811, 0.00433842, 0.5       , 0.5       ])

【讨论】:

  • 虽然您的代码可能有效,但它会鼓励不良做法。
  • @hpaulj:我没有任何疑问。无论如何,这可能不是干净的代码。但请记住,我是一个刚刚学习数组的初学者。这个任务是为了学习和熟悉在“边做边学”中使用数组。但是,话虽如此,如果您愿意向我展示一个被认为是良好做法的解决方案,我将非常感激:-)
  • 有很多关于np.append 的不良用途的帖子。它不是列表追加克隆,不应该这样使用。
  • @not_speshal:感谢您帮助我并为我提供了可以学习的工作代码。干杯。
  • @hpaulj:当然。采取的观点。感谢您的反馈。我希望你有时间向我展示一个好的实践解决方案是什么。那会很有帮助。
【解决方案2】:

在学习使用numpy 时,您需要准备好numpy 文档,并花时间阅读基础知识以及您使用的每个功能的帮助。不要天真地将数组“视为列表”。

def read_from_file(filename):

a = np.array

np.array 是一个函数。为什么要将它分配给变量?数组是用a=np.array([[1,2],[3,4]]) 之类的表达式创建的。重新阅读np.array 文档。

with open(filename, "r") as infile:
    infile.readline()
    for line in infile:
        infile.readline()
        delta_x = float(line[9:21].strip())
        ...

        a = np.append(delta_x)

np.append docs 说它从两个输入中复制,

In [239]: x =np.append(np.array([1,2,3]), 4)
In [240]: x
Out[240]: array([1, 2, 3, 4])

它不像列表追加那样就地操作。 np.append 文档试图说明这一点。唯一更清楚的是完全删除该功能!

In [241]: x=[1,2,3]
In [242]: x.append(4)
In [243]: x
Out[243]: [1, 2, 3, 4]

如果你必须迭代地构建一个数组,坚持使用列表直到结束

a = [] for _ 在循环中: a.附加(值) arr = np.array(a)

如果正确使用,numpy 数组可以比列表更快,如文档所述。如果使用类似列表,它们不会更快。如果有的话,它们会更慢,而且通常甚至不起作用。

我怀疑您的文件可以通过np.genfromtxt 读取,使用指定列宽的delimiter 版本。

delimiter : str, int, or sequence, optional
The string used to separate values.  By default, any consecutive
whitespaces act as delimiter.  An integer or sequence of integers
can also be provided as width(s) of each field.

说到genfromtxt,该函数逐行读取文件,将结果收集到列表列表中(每行一个子列表)。然后它从最后的结果中生成二维数组。它不会像列表那样尝试增量构建数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 2017-01-18
    • 2017-11-14
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多