【问题标题】:Reading multiple txt files and saving them into one numpy array: how to concatenate numpy arrays读取多个 txt 文件并将它们保存到一个 numpy 数组中:如何连接 numpy 数组
【发布时间】:2017-07-05 16:34:35
【问题描述】:

a) 这是我的尝试。它有效,但我想知道我是否可以在没有 if else 条件和索引的情况下做到这一点——更 Pythonic 的方式。

sensor_files = ['file1.csv', 'file2.csv']

for idx,sensor_file in enumerate(sensor_files):
    with open(file, 'rb') as f:
        clean_lines = (line.replace(b';',b',') 
        sensors = np.genfromtxt(clean_lines, dtype=int, delimiter=',')
        if idx == 0: 
            acc_measurements = sensors
        else:
            acc_measurements = np.concatenate((acc_measurements, sensors))

【问题讨论】:

  • 你可以使用外部库吗? pandas 处理得很好。
  • 当然。请您发布解决方案吗?
  • 为什么是replace?你不能用delimiter=';'吗? sensors 的形状是什么(两个文件之后)?除非这些文件有什么有趣的地方,否则genfromtxt 应该能够像pandas 一样阅读它们。
  • @hpaulj 因为我有分隔符 ',' 和 ';'。

标签: python arrays numpy concatenation


【解决方案1】:

列表追加版本:

alist = []
for sensor_file in sensor_files:
    with open(sensor_file, 'rb') as f:
        clean_lines = (line.replace(b';',b',') 
        sensors = np.genfromtxt(clean_lines, dtype=int, delimiter=',')
        alist.append(sensors)
acc_measurements = np.concatenate(alist)

genfromtxt 做了类似的事情。它迭代文件行,解析每个文件并将其附加到列表中。最后,它将列表列表转换为具有正确 dtype 的数组。

每个concatenate 创建一个新数组,从参数中复制数据。列表追加操作“就地”添加一个指向新source 的指针。列表是为快速追加而设计的。

【讨论】:

  • 谢谢。实际上最简单的解决方案 - 我也可以自己做。最后两行alist.extend(sensors); acc_measurements = np.array(alist) 和你的版本有什么区别?
  • 我不会使用extend。它沿第一个维度拆分sensors。因此,如果sensors 是 2d,则列表将是 1d 数组的列表。您必须使用 vstack 或 stack 而不是 concatenate 来加入他们。但是请继续进行实验(使用少量样本)。
【解决方案2】:

您可以创建一个包含所需列的空数组,然后循环使用numpy.vstack。

喜欢:

 arr = numpy.array([[]]*5)   ## real length of sensors
 for idx,sensor_file in enumerate(sensor_files):
     ....
     arr = numpy.vstack((arr, sensors))

【讨论】:

  • 我尝试了:a =np.array([[]]*20) 然后np.vstack((a, np.ones((20,0)), )) 输出:array([], shape=(40, 0), dtype=float64) 所以它们堆叠得很好。
  • 请不要重复vstack。改为附加到列表,并在最后将列表转换为数组。它更简单、更快捷。
  • 但是如果文件很大怎么办? np.array 会比列表更紧凑
【解决方案3】:

使用 pandas 的巧妙解决方案是

import pandas as pd
df1 = pd.read_csv("file1.csv")
df2 = pd.read_csv("file2.csv")
df_concatenated = df1.append(df2)

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 2012-04-04
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多