numpy:读取任意数量的.txt文件并将数据保存在一个numpy数组中

问题描述

对不起,如果以前有人问过我,我什么都找不到。

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

enter image description here

读取它们,连接所有行并将其保存到一个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],delimiter='\t')
        raw = np.vstack((raw,raw_i))
    return raw

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

test = readInSpectra(files)

解决方法

我不确定,但我认为重复的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')
,

两者都应该起作用,我建议您按照@obchardon的建议进行第二次

import wx

class MainFream(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,title='test',size=(500,500),style=wx.DEFAULT_FRAME_STYLE)
        self.MainPanel = wx.Panel(self)

        test = []
        button_id = []
        for i in range(1,21):
            test.append(i)
            button_id.append(wx.NewId())

        self.button = []
        for i in range(len(test)):
            self.button.append(wx.Button(self.MainPanel,button_id[i],label=(str(test[i]))))
            self.button[i].Bind(wx.EVT_BUTTON,self.OnButton)

        self.button[2].SetOwnForegroundColour(wx.RED)
        self.button[9].SetOwnForegroundColour(wx.GREEN)
        self.button[12].SetOwnForegroundColour("brown")
        self.button[16].SetOwnForegroundColour("cadetblue")

        sizer = wx.FlexGridSizer(0,5,5)
        for i in self.button:
            sizer.Add(i,wx.ALL,0)
        self.MainPanel.SetSizer(sizer)

    def OnButton(self,event):
        Id = event.GetId()
        Obj = event.GetEventObject()
        print ("Button Id",Id)
        print ("Button Pressed:",Obj.GetLabelText())

if __name__ == '__main__':
    app = wx.App()
    fream = MainFream()
    fream.Show()

    app.MainLoop()