有一个大小为 的二进制数组 α(0 和 1)AxA
。
我想得到一个大小为 β 的新二进制数组BxB
。小2倍,因此数组
B
比小4倍。 A
BxB
AxA
规则如下:
- 如果数组 α 的以下元素中的至少
(x;y)
一个等于 1,则数组 β的“像素”等于 1:(2x; 2y), (2x+1; 2y), (2x; 2y+1), (2x+1; 2y+1)
我有这个代码:
def compress_4_times (canvas):
new_size = 16
field = [[0]*new_size]*new_size
for y in range(0, new_size):
for x in range(0, new_size):
_x, _y = 2*x, 2*y
count_active = 0
if is_pixel_active(canvas, _x, _y):
count_active += 1
if is_pixel_active(canvas, _x+1, _y):
count_active += 1
if is_pixel_active(canvas, _x, _y+1):
count_active += 1
if is_pixel_active(canvas, _x+1, _y+1):
count_active += 1
if count_active > 0:
field[x][y] = True
else:
field[x][y] = False
return field
给定一个数组 α 作为输入,应该返回 β。在此示例中,大小 α 为 32。
问题:
在循环过程中,一切正常,我检查了打印:一些像素变为真,而且显然是正确的。
但是该函数返回一个只有 False 的数组!它不包含任何 True!
似乎循环完成后,由于某种原因,该字段被重置。为什么会这样?
我希望我正确地推断出翻译规则。例如,我想转这个:
0 0 0 1
0 1 1 0
0 0 0 1
0 0 1 1
进入这个:
1 1
0 1
这个问题已经在这里讨论过很多次了,你只需要能够识别它。将列表列表的初始化替换为:
初始化的问题是那里的第二次乘法不会创建新列表,而是多次克隆对同一列表的引用。因此,其中一个列表中的任何更改都会立即反映在所有其他列表中 - 毕竟,这是同一个列表。
但是第一次乘法没有问题,因为它
0
是一个标量,当它“相乘”时,一个普通列表是从值创建的,而不是从链接创建的。顺便说一句,您的检查可以大大减少(并加速 - 并非所有检查都会执行,但在第一次成功检查之前):
一般来说,你正在做的操作叫做
pooling
,在神经网络中有这样一个规则层,特别是在库中Keras
。您也可以尝试这种压缩方法:
结果:
UPD
对于其他压缩级别,必须部分重写此代码。例如,压缩 9 倍,结果如下:
结果: