Увеличить размер np.array

#python #numpy #tensorflow #reshape

#python #numpy #тензорный поток #изменить форму

Вопрос:

Я запустил Conv1D на матрице X формы (2000, 20, 28) для размера пакета 2000, 20 временных шагов и 28 функций. Я хотел бы перейти к Conv2D CNN и увеличить размерность моей матрицы до (2000, 20, 28, 10), имеющей 10 элементов, для которых я могу построить (2000, 20, 28) X-матрицу. Аналогично, я хочу получить массив y размером (2000, 10), т. е. в 5 раз больше массива y размером (2000, ), который я использовал для сетей LSTM и Conv1D.

Код, который я использовал для создания 20 временных шагов из входных данных, dataY, был

 def LSTM_create_dataset(dataX, dataY, seq_length, step):
    Xs, ys = [], []
    for i in range(0, len(dataX) - seq_length, step):
        v = dataX.iloc[i:(i   seq_length)].values
        Xs.append(v)
        ys.append(dataY.iloc[i   seq_length])
    return np.array(Xs), np.array(ys)
  

Я использую эту функцию в цикле, который я подготовил для создания данных моего Conv2D NN :

 for ric in rics:
    dataX, dataY = get_model_data(dbInput, dbList, ric, horiz, drop_rows, triggerUp1, triggerLoss, triggerUp2 = 0)
    dataX = get_model_cleanXset(dataX, trigger)                             # Clean X matrix for insufficient data
    Xs, ys = LSTM_create_dataset(dataX, dataY, seq_length, step)        # slide over seq_length for a 3D matrix
    Xconv.append(Xs)
    yconv.append(ys)
    Xconv.append(Xs)
    yconv.append(ys)
  

Я получаю матрицу Xconv (10, 2000, 20, 28) вместо (2000, 20, 28, 10) целевой выходной матрицы X и матрицу y (10, 2000) вместо целевой (2000, 10).
Я знаю, что могу легко изменить yconv с помощью yconv = np.reshape(yconv, (2000, 5)) . Но функция reshape для Xconv Xconv = np.reshape(Xconv, (2000, 20, 28, 10)) кажется опасной, поскольку я не могу визуализировать вывод и даже ошибочной.
Как я мог бы сделать это безопасно (или не могли бы вы подтвердить мою первую попытку?
Заранее большое спасибо.

Ответ №1:

Если ваша матрица для y имеет форму (10, 2000), то вы не сможете придать ей желаемую форму (2000,5). Я продемонстрировал это ниже.

 # create array of same shape as your original y
arr_1 = np.arange(0,2000*10).reshape(10,2000) 
print(arr_1.shape) # returns (10,2000)
arr_1 = arr_1.reshape(2000,5)
  

Это возвращает следующее сообщение об ошибке, поскольку крайне важно, чтобы размеры фигур «до» и «после» совпадали.

 ValueError: cannot reshape array of size 20000 into shape (2000,5)  
  

Я не совсем понимаю утверждение о том, что вы не можете визуализировать выходные данные — вы могли бы вручную проверить, что reshape функция выполнила это правильно, если хотите, для вашего набора данных (или небольшой его части, чтобы подтвердить, что функция работает эффективно), используя инструкции print, как показано ниже — путем сравнения выходных данных с вашими исходными данными и того, как вы ожидаете, что данные будут выглядеть впоследствии.

 import numpy as np

arr = np.arange(0,2000) 
arr = arr.reshape(20,10,10,1) # reshape array to shape (20, 10, 10, 1)

# these statements let you examine the array contents at varying depths
print(arr[0][0][0])
print(arr[0][0])
  

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

1. Действительно. Я имел в виду (2000, 10), что достигается с помощью reshape…