Numpy: считывает произвольное количество файлов .txt и сохраняет данные в одном массиве numpy

#python #arrays #numpy #genfromtxt #txt

#python #массивы #numpy #genfromtxt #txt

Вопрос:

Извините, если об этом спрашивали ранее, я ничего не смог найти.

Я пытаюсь определить функцию, которая принимает произвольное количество файлов .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)
  

Комментарии:

1. Почему вы распаковываете свой входной кортеж? Python будет рассматривать каждый элемент вашего кортежа как отдельный аргумент.

2. просто используйте def readInSpectra(files) вместо def readInSpectra(*files) .

3. Верно, это работает. Я поискал в Google «функцию python с неизвестным количеством аргументов» и обнаружил, что я должен использовать кортеж, например, в качестве аргумента и записи function(*argument) . Я уверен, что это все еще сильный «не тот путь», неэлегантный, но теперь он делает то, что я хотел.

4. @Wulfram Вы все равно можете использовать свою исходную версию, просто назовите ее по-другому (см. Мое редактирование)

5. @Wulfram у вас нет неизвестного количества аргументов, у вас есть 1 аргумент с несколькими элементами в нем, в данном случае 1 кортеж строки.

Ответ №1:

Оба должны работать, я предлагаю вам сделать второе, как предложил @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)
  

Ответ №2:

Я не совсем уверен, но я думаю, что повторение 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')
  

Комментарии:

1. Затем я также получаю array([[nan, nan, nan]]) в качестве возврата.

2. Мой ответ сработал, но я предлагаю вам воспользоваться советом @obchardon

3. @ted930511 Вы правы, проблема заключалась в том, как вызывалась функция