#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 Вы правы, проблема заключалась в том, как вызывалась функция