Рассчитать возможные размеры изображения из числа пикселей - PullRequest
0 голосов
/ 09 сентября 2018

Если у меня есть изображение шириной x высотой пикселей, я хотел бы написать функцию, которая возвращает список наборов (ширина, высота) с возможными способами переупорядочения этих пикселей.

Если изображение, например, имеет размер 87 * 87 пикселей, я могу указать ширину и высоту, чтобы получить список простых чисел:

[3, 3, 29, 29]

Теперь я хотел бы написать функцию, которая организует эти простые числа всеми возможными способами в группы по 2, чтобы получить что-то вроде:

[(3, 3 * 29 * 29), (29,3 * 3 * 29), (3 * 3, 29 * 29), (29 * 29, 3 * 3), (3 * 29, 3 * 29), (3 * 3 * 29, 29), (3 * 29 * 29, 3)]

Я оставил простые числа без умножения для ясности. Теперь я сделал это вручную, но я бы предпочел сделать функцию. И я не нашел простого способа сделать это в Python, даже с помощью itertools.

Например, это печатает комбинации 3 из списка l:

l = [3, 3, 29, 29]
for t in itertools.groupby(itertools.combinations(l, 3)):
    print(t[0])

Но в действительности это не говорит о том, что является четвертым элементом, который не учитывается в каждой комбинации.

Есть ли у кого-нибудь хороший способ вычислить все возможные 2-кортежи из списка простых чисел. Все простые числа должны использоваться в каждом кортеже по обе стороны от запятой. Желательно без дубликатов (это то, что для groupby в моем примере).

1 Ответ

0 голосов
/ 09 сентября 2018

Это проще, чем то, что вы пытаетесь с простыми факторами.

a = 87*87
print([(x, a//x) for x in range(1, 1+int(math.sqrt(a))) if a % x == 0])

Выход:

[(1, 7569), (3, 2523), (9, 841), (29, 261), (87, 87)]

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

Даже если у вас огромная текстура (скажем, 16384x16384), это будет практически мгновенно.

...