根据像素数计算可能的图像尺寸

时间:2018-09-09 12:46:28

标签: python itertools prime-factoring

如果我有一个宽度x高度像素的图像,我想编写一个函数,该函数返回(宽度,高度)tupel列表,并以可能的方式重新排列这些像素。

例如,如果图像为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)]

为了清楚起见,我没有将素数相乘。现在,我手动执行此操作,但我希望有一个函数来执行此操作。而且,即使使用itertools,我也没有找到在Python中执行此操作的简便方法。

例如,这将打印列表l中的3的组合:

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

但是并不能真正分辨出第四个元素是哪个,而每个组合中都没有。

有人能从素数列表中计算出所有可能的2元组吗?在每个元组中,必须在逗号的两侧使用所有素数。最好不要重复(在我的示例中就是groupby)。

1 个答案:

答案 0 :(得分:2)

比您尝试使用主要因子要容易。

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),也基本上是即时的。