Numpy: Как случайно разбить / выбрать матрицу на n-разных матриц - PullRequest
13 голосов
/ 01 февраля 2012
  • У меня есть пустая матрица с формой (4601, 58).
  • Я хочу разбить матрицу случайным образом по 60%, 20%, 20% по количеству строк
  • Это для задачи машинного обучения мне нужно
  • Есть ли функция numpy, которая случайным образом выбирает строки?

Ответы [ 4 ]

18 голосов
/ 01 февраля 2012

вы можете использовать numpy.random.shuffle

import numpy as np

N = 4601
data = np.arange(N*58).reshape(-1, 58)
np.random.shuffle(data)

a = data[:int(N*0.6)]
b = data[int(N*0.6):int(N*0.8)]
c = data[int(N*0.8):]
7 голосов
/ 01 февраля 2012

Дополнение к ответу HYRY, если вы хотите последовательно перемешать несколько массивов x, y, z с одним и тем же первым измерением: x.shape[0] == y.shape[0] == z.shape[0] == n_samples.

Вы можете сделать:

rng = np.random.RandomState(42)  # reproducible results with a fixed seed
indices = np.arange(n_samples)
rng.shuffle(indices)
x_shuffled = x[indices]
y_shuffled = y[indices]
z_shuffled = z[indices]

Изатем выполните разделение каждого перемешанного массива, как в ответе HYRY.

3 голосов
/ 01 февраля 2012

Если вы хотите случайным образом выбрать строки, вы можете просто использовать random.sample из стандартной библиотеки Python:

import random

population = range(4601) # Your number of rows
choice = random.sample(population, k) # k being the number of samples you require

random.sample сэмплов без замены, поэтому вам не нужно беспокоиться о повторениистроки, заканчивающиеся на choice.Для данного массива с именем matrix вы можете выделить строки путем нарезки, например: matrix[choice].

. Конечно, k может быть равным количеству всех элементов в совокупности,и тогда choice будет содержать случайный порядок индексов для ваших строк.Затем вы можете разбить choice на ваше усмотрение, если это все, что вам нужно.

2 голосов
/ 04 февраля 2017

Поскольку вам это нужно для машинного обучения, вот метод, который я написал:

import numpy as np

def split_random(matrix, percent_train=70, percent_test=15):
    """
    Splits matrix data into randomly ordered sets 
    grouped by provided percentages.

    Usage:
    rows = 100
    columns = 2
    matrix = np.random.rand(rows, columns)
    training, testing, validation = \
    split_random(matrix, percent_train=80, percent_test=10)

    percent_validation 10
    training (80, 2)
    testing (10, 2)
    validation (10, 2)

    Returns:
    - training_data: percentage_train e.g. 70%
    - testing_data: percent_test e.g. 15%
    - validation_data: reminder from 100% e.g. 15%
    Created by Uki D. Lucas on Feb. 4, 2017
    """

    percent_validation = 100 - percent_train - percent_test

    if percent_validation < 0:
        print("Make sure that the provided sum of " + \
        "training and testing percentages is equal, " + \
        "or less than 100%.")
        percent_validation = 0
    else:
        print("percent_validation", percent_validation)

    #print(matrix)  
    rows = matrix.shape[0]
    np.random.shuffle(matrix)

    end_training = int(rows*percent_train/100)    
    end_testing = end_training + int((rows * percent_test/100))

    training = matrix[:end_training]
    testing = matrix[end_training:end_testing]
    validation = matrix[end_testing:]
    return training, testing, validation

# TEST:
rows = 100
columns = 2
matrix = np.random.rand(rows, columns)
training, testing, validation = split_random(matrix, percent_train=80, percent_test=10) 

print("training",training.shape)
print("testing",testing.shape)
print("validation",validation.shape)

print(split_random.__doc__)
  • тренировка (80, 2)
  • тестирование (10, 2)
  • проверка (10, 2)
...