Как совместить 2 ndarrays с различными размерами? - PullRequest
0 голосов
/ 27 марта 2019

У меня есть массив (123, 3072), и мне нужно разделить его на 5 приблизительно одинаковых сгибов (приблизительно, потому что 123 нельзя разделить на 5, например), чтобы выполнить 5-кратную перекрестную проверку,scikit-Learn не допускается.Я попытался получить 2 ndarrays размера (3, 25, 3072) и (2, 24, 3072).Теперь мне нужно объединить их, но каждая функция, которую я пробую, поднимает это:

ValueError: all the input array dimensions except for the concatenation 
axis must match exactly 

Возможно ли их объединить?

Это мой код:

num_folds = 5
mod = binary_train_X.shape[0] % num_folds
first_records = (binary_train_X.shape[0] - mod) // num_folds + 1
last_records = first_records - 1
first_part = binary_train_X[:mod * first_records].reshape([mod, first_records, -1])
second_part = binary_train_X[mod * first_records:].reshape([num_folds - mod, last_records, -1])
folds_X = np.concatenate((first_part, second_part))

Или, может быть, есть другой способ разделить его на 5 частей (сгибы)?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Поскольку 377856 (123*3072) не делится на 15360 (5*3072) (123 не делится на 5), можно создать только 5 равных срезов по 3072 путем усечения или дополнения до кратного 15360 (5*3072).

Усечение создает форму (5, 24, 3072), отбрасывая значения от конца до выравнивания:

folds = binary_train_X.flatten()[:np.prod(binary_train_X.shape)//(5*3072)*(5*3072)].reshape(5, -1, 3072)
# this discards 9216 (3072*3) values

Заполнение создает форму (5, 25, 3072), добавляя нули в конец до выравнивания:

folds = np.pad(binary_train_X.flatten(), (0, -(-np.prod(binary_train_X.shape)//(5*3072))*(5*3072)-np.prod(binary_train_X.shape)), 'constant').reshape(5, -1, 3072)
# this appends 6144 (3072*2) zeros
0 голосов
/ 27 марта 2019

Что-то очень похожее на это, если не совсем так.

def k_fold(array, num_folds): #New to WOS
    #Splits along axis 0 of array
    folds = []
    start = 0
    step = array.shape[0]/num_folds
    for i in range(num_folds):
        end = int(start + step)
        start = int(start)
        fold = array[start:end]
        rest_of_array = np.concatenate((array[:start],array[end:]), axis = 0)
        start = end
        folds.append((fold, rest_of_array))
    return folds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...