Как настроить значения массива numpy, пока не будут выполнены условия - PullRequest
0 голосов
/ 08 апреля 2020

Например, у меня есть 4 матрицы, подобные этой

import random
import numpy as np

base = range(2, 46, 2)

table1 = np.array(random.sample(base, 9)).reshape(3,3)
table2 = np.array(random.sample(base, 9)).reshape(3,3)
table3 = np.array(random.sample(base, 9)).reshape(3,3)
table4 = np.array(random.sample(base, 9)).reshape(3,3)

Таблицы должны удовлетворять следующим условиям:

  1. table4 должен иметь строку где каждый элемент больше, чем элементы в других строках по столбцам. Например, [[1,2,3],[2,3,4],[5,6,7]], третья строка удовлетворяет этому условию.

  2. в table1, table2 и table3 должна быть одна строка, сумма элементов которой в этой строке является наивысшим по сравнению с двумя другими строками, а остальные два ряда должны иметь одинаковую сумму. Например, [[1,2,5],[2,3,3],[3,4,3]], первые две строки имеют одинаковую сумму 8, а третья строка имеет наибольшую сумму 13.

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

1 Ответ

1 голос
/ 08 апреля 2020

В обоих случаях вы можете построить свои таблицы так, чтобы они удовлетворяли условиям, вместо того, чтобы генерировать кучу случайных таблиц и надеяться, что они их удовлетворят. Я предполагаю, что все значения должны быть в указанном c наборе, как base = range(2, 46, 2). Кроме того, я обязываю все значения быть уникальными в каждой таблице, что является более жестким ограничением, чем то, что вы в последний раз упомянули, но его легче понять.

  1. Для table4:
import random
import numpy as np

base = range(2, 46, 2)

# Generate a table at random
table = np.array(random.sample(base, 9)).reshape(3, 3)
# sort along first axis
table.sort(axis=0)
print table

например,

[[16  8 20]
 [24 26 36]
 [30 40 42]]

Затем вы можете изменить порядок строк в случайном порядке, если вы не хотите, чтобы самые высокие значения (систематически) в последнем.

Для table1, table2, table3:
import random
from itertools import combinations
from collections import Counter
import numpy as np

base = range(2, 46, 2)

# generate all combinations of 3 elements in 'base'
# as a list of 3-tuple
comb = [x for x in combinations(base, 3)]
# append to each tuple the sum of its elements
sums = [x + (sum(x),) for x in comb]
# list all the sums
possible_sums = [x[3] for x in sums]
# count the occurrences of each sum value
c = Counter(possible_sums)
# keep only the sums which occur at least twice
# and which are not the highest
max_sum = max(possible_sums)
c2 = Counter(x for x in c.elements() if c[x] >= 2 and c[x] < max_sum)
valid_sums = list(c2)
# pick one of those at random
r_sum = random.choice(valid_sums)
# list all the combinations for this sum
combs_for_r_sum = [x[:3] for x in sums if x[3] == r_sum]
# pick 2 among those at random
row1, row2 = random.sample(combs_for_r_sum, 2)
# for row 3, pick a combination with a sum higher than r_sum
sum2 = random.choice([x for x in possible_sums if x > r_sum])
combs_for_sum2 = [x[:3] for x in sums if x[3] == sum2]
row3 = random.choice(combs_for_sum2)

table = np.array(row1 + row2 + row3).reshape(3, 3)
print table

Например,

[[ 2 28 32]
 [10 24 28]
 [20 42 44]]

Опять же, вы можете изменить порядок строк в случайном порядке, если вы не не хочу, чтобы «самая высокая» строка (систематически) была последней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...