Выберите первые 20% списка, затем следующие 20% списка - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть такой список с примерно 141 записями:

training = [40.0,49.0,77.0,...... 3122.0]

, и моя цель состоит в том, чтобы выбрать первые 20% списка.Я сделал это так:

testfile_first20 = training[0:int(len(set(training))*0.2)]
testfile_second20 = training[int(len(set(training))*0.2):int(len(set(training))*0.4)]
testfile_third20 = training[int(len(set(training))*0.4):int(len(set(training))*0.6)]
testfile_fourth20 = training[int(len(set(training))*0.6):int(len(set(training))*0.8)]
testfile_fifth20 = training[int(len(set(training))*0.8):]

Есть ли способ сделать это автоматически в цикле?Это мой способ выбора Kfold.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 22 ноября 2018

Вот простой пример с пониманием списка

lst = list('abcdefghijkl')
l = len(lst)

[lst[i:i+l//5] for i in range(0, l, l//5)]

# [['a', 'b'], 
#  ['c', 'd'], 
#  ['e', 'f'], 
#  ['g', 'h'], 
#  ['i', 'j'], 
#  ['k', 'l']]

Редактировать: На самом деле, теперь, когда я смотрю на свой ответ, это не настоящее 20% -ное представление, поскольку оно возвращает 6 подсписков вместо 5. Что ожидаетсяпроизойдет, когда список не может быть поровну разделен на 5 частей?Я оставлю это пока, пока не будут даны дальнейшие разъяснения.

0 голосов
/ 22 ноября 2018

Вы можете зациклить это, просто сохраняя «размер» 20% и текущую начальную точку в двух переменных.Затем добавьте одно к другому:

start = 0
twenty_pct = len(training) // 5

parts = []
for k in range(5):
    parts.append(training[start:start+twenty_pct])
    start += twenty_pct

Тем не менее, Я подозреваю, что есть операции numpy / pandas / scipy, которые могли бы лучше соответствовать тому, что вы хотите.Например, sklearn включает функцию с именем KFold: https://scikit -learn.org / stable / modules / generate / sklearn.model_selection.KFold.html

0 голосов
/ 22 ноября 2018

Примерно так, но может быть вы потеряете элемент из-за округления.

tlen = float(len(training))    
testfiles = [ training[ int(i*0.2*tlen): int((i+1)*0.2*tlen) ] for i in range(5) ]
0 голосов
/ 22 ноября 2018

Вы можете использовать списки:

div_length = int(0.2*len(set(training)))
testfile_divisions = [training[i*div_length:(i+1)*div_length] for i in range(5)]

Это даст вам результаты, собранные в список:

>>> [testfile_first20, testfile_second20, testfile_third20, testfile_fourth20, testfile_fifth20]

Если len(training) не делится поровну на пять частей,тогда у вас может быть пять полных делений с шестым, берущим остаток следующим образом:

import math

div_length = math.floor(0.2*len(set(training)))
testfile_divisions = [training[i*div_length:min(len(training), (i+1)*div_length)] for i in range(6)]

, или вы можете иметь четыре полных деления с пятым, берущим остаток следующим образом:

import math

div_length = math.ceil(0.2*len(set(training)))
testfile_divisions = [training[i*div_length:min(len(training), (i+1)*div_length)] for i in range(5)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...