0
0 комментариев

Есть много массивов, каждый элемент которых — набор из 7ми floats.

На i-м месте каждого массива лежит набор, который должен всплыть максимально вверх (i для каждого массива разное).

Нужно найти такие float-параметры, чтобы при домножении на них

sum(p*x for p,x in zip(params, pack)) --->> max for each array

сумма заданного набора была максимальной, т.е. набор всплыл вверх при
сортировке.

Расскажите, пожалуйста, Ваши идеи.

Заранее спасибо.

Edit:

# Для простоты рассмотрим для 2х floats
# Дано:
array1 = [(1,4),(2,7),(3,1)] (i=2)
array2 = [(1,4),(2,5),(3,6)] (i=1)
...
 
# Найти:
p1 и p2
# чтобы p1 * array1[i][0] + p2 * array1[i][1] --->> max
 
# очевидно, что надо увеличивать те координаты набора,
# которые уже больше, чем у остальных,
# и уменьшать те координаты, которые у набора меньше
 
# Мой вариант решения:
p1, p2 = 1, 1
for array in [array1, array2, ...]:
    array = np.array(array)
 
    stats, means = [], []
    for column in array.T:
        # 5-я порядковая статистика от максимума
        stats.append(np.partition(column, -5)[-5])
        means.append(np.mean(column))
 
    for j,coord in enumerate(array[i,:]):
        # Если координата искомого вектора достаточно велика
        # относительно других наборов в массиве -
        # делаем её ещё больше
        if stats[j] <= coord:
            p[i] += means[i] # p1 | p2
        else:
            # иначе делаем её по меньше
            p[i] += 1. / means[i] # p1 | p2
 
# В конце делим на количество массивов
p1 /= len(arrays)
p2 /= len(arrays)

Изменен статус публикации
Добавить комментарий