Разбиение массива чисел во всех возможных комбинациях


Это принимает массив чисел, затем разбивает его на все возможные комбинации из номерного массива размером 4 потом в другой массив кладет объедки. Как я хочу забрать разницу в средних значений первого столбца и второй.

import itertools

#defines the array of numbers and the two columns
number = [53, 64, 68, 71, 77, 82, 85]
col_one = []
col_two = []

#creates an array that holds the first four
results = itertools.combinations(number,4)

for x in results:
    col_one.append(list(x))

#attempts to go through and remove those numbers in the first array
#and then add that array to col_two
for i in range(len(col_one)):
    holder = list(number)
    for j in range(4):
        holder.remove(col_one[i][j])
    col_two.append(holder)  

col_one_average = []
col_two_average = []

for k in col_one:
    col_one_average.append(sum(k)/len(k))

for l in col_two:
    col_two_average.append(sum(l)/len(l))

dif = []

for i in range(len(col_one_average)):
    dif.append(col_one_average[i] - col_two_average[i])

print dif

Так, например, если у меня

a = [1,2,3]

и я хочу разбить его на массив размера 2 и 1, я получаю

col_one[0] = [1,2]

и

col_two[0] = [3]

тогда

col_one[1] = [1,3]

и

col_two[1] = [2]

После того как я получу все те, кого я найти среднее col_one[0] - среднее col_two[0].

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



10546
6
задан 3 марта 2011 в 04:03 Источник Поделиться
Комментарии
2 ответа

import itertools
import numpy

number = [53, 64, 68, 71, 77, 82, 85]

results = itertools.combinations(number,4)
# convert the combination iterator into a numpy array
col_one = numpy.array(list(results))

# calculate average of col_one
col_one_average = numpy.mean(col_one, axis = 1).astype(int)

# I don't actually create col_two, as I never figured out a good way to do it
# But since I only need the sum, I figure that out by subtraction
col_two_average = (numpy.sum(number) - numpy.sum(col_one, axis = 1)) / 3

dif = col_one_average - col_two_average

print dif

8
ответ дан 3 марта 2011 в 09:03 Источник Поделиться

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


  • Это мелочи, но в ваших комментариях вы называете массивы списки, но это в Python они называются списками

  • Имена переменных, как col_one и col_two не очень значимым. Может быть, вы должны называть их комбинаций и упирается или что-то подобное.

  • Вы должны обязательно рефакторинг кода в функции

  • Вы часто используете индексное петли там, где это не нужно. Где возможно, вы должны выполнять элемент, а не Индекс.

  • Вы также часто списки на пустой список, а затем добавляя к ним в цикле. Это, как правило, более подходящие для Python и часто быстрее использовать списочные включения для этого.

Если я пишу код, я напишу что-то вроде этого:

import itertools

def average(lst):
"""Returns the average of a list or other iterable"""

return sum(lst)/len(lst)

def list_difference(lst1, lst2):
"""Returns the difference between two iterables, i.e. a list containing all
elements of lst1 that are not in lst2"""

result = list(lst1)
for x in lst2:
result.remove(x)
return result

def differences(numbers, n):
"""Returns a list containing the difference between a combination and the remaining
elements of the list for all combinations of size n of the given list"""

# Build lists containing the combinations of size n and the rests
combinations = list(itertools.combinations(numbers, n))
rests = [list_difference(numbers, row) for row in col_one]

# Create a lists of averages of the combinations and the rests
combination_averages = [average(k) for k in combinations]
rest_averages = [average(k) for k in rests]

# Create a list containing the differences between the averages
# using zip to iterate both lists in parallel
diffs = [avg1 - avg2 for avg1, avg2 in zip(combination_averages, rest_averages)]
return diffs

print differences([53, 64, 68, 71, 77, 82, 85], 4)

5
ответ дан 3 марта 2011 в 05:03 Источник Поделиться