我试图用所有可能的组合制作一个4x4(16)像素的黑白图像数组。我将以下数组作为模板:
template = [[0,0,0,0], # start with all white pixels
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]]
然后,我想迭代模板,并为每个可能的组合将0更改为1。 我尝试使用numpy和itertools迭代,但只能得到256个组合,而我的计算应该有32000(编辑:65536!不知道那里发生了什么......)。任何一个有疯狂技能可以帮助我的人?
答案 0 :(得分:1)
正如您所说,您可以使用itertools
模块执行此操作,尤其是product
功能:
import itertools
import numpy as np
# generate all the combinations as string tuples of length 16
seq = itertools.product("01", repeat=16)
for s in seq:
# convert to numpy array and reshape to 4x4
arr = np.fromiter(s, np.int8).reshape(4, 4)
# do something with arr
答案 1 :(得分:0)
依赖于for循环的一种可能性
out = []
for i in range(2**16):
out.append(np.frombuffer("{:016b}".format(i).encode('utf8')).view(np.uint8).reshape(4,4)-48)
如果你愿意,显然你可以把它列为清单。
它利用了Python字符串格式,它能够生成整数的二进制表示。格式字符串指示它使用左侧填充零的16个位置。然后对该字符串进行编码,以提供numpy可以解释为数组的字节对象。
最后,我们减去字符“0”的代码以获得正确的0.幸运的是,“1”位于“0”之上,所以这就是我们需要做的。
答案 2 :(得分:0)
首先,我将迭代从0到(2 ^ 16)-1的所有数字。然后我将为每个数字创建一个16个字符的二进制字符串,从而覆盖所有可能的组合
之后我将字符串转换为列表,并使用列表理解和切片从中创建了2d列表。
all_combinations = []
for i in xrange(pow(2,16))
binary = '{0:016b}'.format(i) ## Converted number to binary string
binary = map(int,list(binary)) ## String to list ## list(map(int,list(binary))) in py 3
template = [binary[i:i+4] for i in xrange(0, len(binary), 4)] #created 2d list
all_combinations.append(template)
答案 3 :(得分:0)
这样的(4 x 4)形阵列总共会有65536
个这样的组合。这是生成所有这些组合的矢量化方法,为我们提供(65536 x 4 x 4)
形状的多维数组 -
mask = ((np.arange(2**16)[:,None] & (1 << np.arange(16))) != 0)
out = mask.astype(int).reshape(-1,4,4)
示例运行 -
In [145]: out.shape
Out[145]: (65536, 4, 4)
In [146]: out
Out[146]:
array([[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[1, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 1, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
...,
[[1, 0, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[0, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])