动态创建然后使用loadtxt(Python3)分配数组

时间:2018-12-13 09:53:26

标签: arrays python-3.x dynamically-generated

说明

基本上,我的问题是关于从CSV文件加载数据。我已经编写了一个代码,可以在数组内加载给定的列数(请参见示例)。 现在,我想改进代码,以便可以更改要读取和加载的列数,而无需每次都修改我的代码。换句话说,我希望我的代码能够动态适应我选择的列数。让我给你一个我当前代码的例子。

代码示例

步骤

1 。使用Tkinter,我选择了要加载的文件,这部分代码返回file_path,其中包含几个文件路径。

2 然后,我定义了用于CSV读取的有用参数。我创建了要加载数据的数组,然后加载了数据。

n = len(file_path)    # number of files

# here I just determine the size of each files with a custom function, m is the maximum size
all_size , m = size_data(file_path,row_skip,col_to_read,delim)

# I create the arrays
shape = (n, m)
time = zeros(shape)
CH1 = zeros(shape)

# define CSV parameters before using loadtxt
row_skip = 5
delim = ';'
col_to_read = (0,1)    # <= This is where I choose the columns to be read

# I load the arrays
for k in range(0, len(file_path)):
    end = all_size[k]    # this is the size of the array to be loaded.
                         # I do this in order to avoid the annoying error
                         # ValueError: could not broadcast input array from shape (20) into shape (50)

    time[k][:end], CH1[k][:end] = loadtxt(file_path[k],
                                           delimiter=delim,
                                           skiprows=row_skip,
                                           usecols=col_to_read,
                                           unpack=True)

我的问题是,如果每个文件都有3列,即col_to_read = (0,1,2),则必须在创建和加载期间添加新的数组CH2 = zeros(shape)。我想要一个动态适应我要加载的列数的解决方案。仅col_to_read会被手动更改。 理想上,我想在一个函数中实现此代码,因为我进行了大量数据分析,并且我不想在每个程序上粘贴相同的代码。

第一个想法

我已经找到了一种动态创建给定数量的零数组(see here)的方法。那是很直接的。

dicty = {}
for i in file_path:
    dicty[i] = []

这看起来不错,但现在无论变量数量如何,我都希望使最后一行有效。我相信有一种方便的方法可以修改我的代码并使用此dicty,但是有些东西我听不懂,而且很困扰。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

好吧,我已经找到解决这个问题的方法了,这已经有几个星期了。在这里问肯定可以帮助我弄清楚问题。

我对词典有了更多的了解,因为这对我来说是新事物,而且我知道它非常强大。我可以用几行替换整个代码:

def import_data(file_path,row_skip,col_to_read,delim):

# file_path is all the PATH strings of CSV files
# row_skip just to start loading from certain row
# col_to_read = (0,1,2), where I choose the col to read
# delim = ';' the delimiter for my CSV files

    dicty = {}                       # create ditcionary
    for i in file_path:              # in order to associate each file
        dicty[i] = []                # with n columns

    for k in range(0, len(file_path)):
        dicty[file_path[k]] = loadtxt(file_path[k], delimiter=delim,
                                      skiprows=row_skip, usecols=col_to_read,
                                      unpack=True)

    # it gives
    # dicty = {'my_file1.csv': array([1,2,3]),
    #          'my_file2.csv': array([2,4,6]),
    #          'my_file3.csv': array([5,10,15])}

    return dicty

这很简单。字典的第一个条目将被所有列填充,依此类推,我不需要告诉字典我会给它多少颜色。然后读取数据,例如,我使用dicty.get(file_path[0])。这可能不是最佳选择,但是我可以肯定地使用for循环创建变量,以摆脱dicty.get()方法。

告诉我您对此的看法,特别是关于计算时间的看法。有时我有20个文件,其中200,000行3列。也许我可以优化加载。