Динамически создавать, а затем назначать массивы с помощью loadtxt (Python3) - PullRequest
0 голосов
/ 13 декабря 2018

Описание

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

Первая идея

Я уже нашел способ динамически создавать заданное количество массивов нулей ( см. Здесь ).Это довольно прямо.

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

это кажется хорошим, но теперь я бы хотел, чтобы последняя строка работала независимо от количества переменных.Я считаю, что есть удобный способ адаптировать мой код и использовать это dicty, но есть кое-что, чего я не понимаю, и я застрял.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 14 декабря 2018

Ну, я нашел решение этой проблемы, о которой думал несколько недель.Задавая это здесь, безусловно, помогло мне прояснить проблему.

Я узнал больше о словарях, так как это было что-то новое для меня, и я понял, что это очень сильно.Я мог бы заменить весь код несколькими строками:

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 кол.Может быть, я мог бы оптимизировать загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...