【问题标题】:Numpy: Read in an arbitrary number of .txt files and save the data in one numpy arrayNumpy:读取任意数量的 .txt 文件并将数据保存在一个 numpy 数组中
【发布时间】:2021-01-16 03:55:40
【问题描述】:

对不起,如果以前有人问过这个问题,我找不到任何东西。

我正在尝试定义一个函数,该函数采用任意数量的 .txt 文件,如下所示

读取它们,连接所有行并将其保存到一个 numpy 数组中。这适用于一个 .txt 文件。一旦我使用两个文件,我就会得到array([nan, nan]) 作为回报,三个文件array([nan, nan, nan]) 等等。

import numpy as np

def readInSpectra(*files):
    raw = np.genfromtxt(files[0], skip_header=0, delimiter='\t')
    for i in range(1, len(files)):
        raw_i = np.genfromtxt(files[i], skip_header=0, delimiter='\t')
        raw = np.vstack((raw, raw_i))
    return raw

files = ('./file1.txt', './file2.txt', './file3.txt')

test = readInSpectra(files)

【问题讨论】:

  • 你为什么要解压你的输入元组? Python 会将元组的每个元素视为不同的参数。
  • 只需使用def readInSpectra(files) 而不是def readInSpectra(*files)
  • 没错,这行得通。我用谷歌搜索“参数数量未知的python函数”,发现我应该使用一个元组,比如作为参数并写function(*argument)。我确信它仍然是强大的“不是要走的路”,但它现在可以满足我的需求。
  • @Wulfram 你仍然可以使用你原来的版本,只是用另一种方式调用它(见我的编辑)
  • @Wulfram 您没有未知数量的参数,您有 1 个包含多个元素的参数,在本例中为 1 个字符串元组。

标签: python arrays numpy genfromtxt txt


【解决方案1】:

我不完全确定,但我认为重复的vstack 是一个问题,因为数组的形状发生了变化。你试过了吗:

def readInSpectra(*files):
    
    stacking = tuple(np.genfromtxt(file, skip_header=0, delimiter='\t')
                     for file in files)

    return np.vstack(stacking)

编辑:我认为你应该这样调用函数

test = readInSpectra(*files)

test = readInSpectra('./file1.txt', './file2.txt', './file3.txt')

【讨论】:

  • 那我也得到array([[nan, nan, nan]])作为回报。
  • 我的回答有效,但我建议你听取@obchardon 的建议
  • @ted930511 你是对的,问题是函数是如何被调用的
【解决方案2】:

两者都应该工作,我建议你按照@obchardon 的建议做第二个

import numpy as np


def readInSpectra_0(*files):
    files = files[0]
    raw = np.genfromtxt(files[0], skip_header=0, delimiter='\t')
    for i in range(1, len(files)):
        raw_i = np.genfromtxt(files[i], skip_header=0, delimiter='\t')
        raw = np.vstack((raw, raw_i))
    return raw

def readInSpectra_1(files):
    
    stacking = tuple(np.genfromtxt(file, skip_header=0, delimiter='\t')
                     for file in files)

    return np.vstack(stacking)

#files = ('file1.txt', 'file2.txt')
files = ('./file1.txt', './file2.txt', './file3.txt')


test = readInSpectra_1(files)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2012-03-22
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多