RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1336069
Accepted
Максим Фисман
Максим Фисман
Asked:2022-10-08 01:56:43 +0000 UTC2022-10-08 01:56:43 +0000 UTC 2022-10-08 01:56:43 +0000 UTC

二进制数组压缩4倍

  • 772

有一个大小为 的二进制数组 α(0 和 1)AxA。
我想得到一个大小为 β 的新二进制数组BxB。小2倍,因此数组
B比小4倍。 ABxBAxA

规则如下:

  • 如果数组 α 的以下元素中的至少(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
python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    CrazyElf
    2022-10-08T02:23:30Z2022-10-08T02:23:30Z

    这个问题已经在这里讨论过很多次了,你只需要能够识别它。将列表列表的初始化替换为:

    field = [[0] * new_size for _ in range(new_size)]
    

    初始化的问题是那里的第二次乘法不会创建新列表,而是多次克隆对同一列表的引用。因此,其中一个列表中的任何更改都会立即反映在所有其他列表中 - 毕竟,这是同一个列表。

    但是第一次乘法没有问题,因为它0是一个标量,当它“相乘”时,一个普通列表是从值创建的,而不是从链接创建的。

    顺便说一句,您的检查可以大大减少(并加速 - 并非所有检查都会执行,但在第一次成功检查之前):

                field[x][y] = any((
                    is_pixel_active(canvas, _x, _y),
                    is_pixel_active(canvas, _x+1, _y),
                    is_pixel_active(canvas, _x, _y+1),
                    is_pixel_active(canvas, _x+1, _y+1)
                ))
    

    一般来说,你正在做的操作叫做pooling,在神经网络中有这样一个规则层,特别是在库中Keras。

    • 4
  2. SergFSM
    2022-10-08T17:01:21Z2022-10-08T17:01:21Z

    您也可以尝试这种压缩方法:

    matr = [[0,0,0,1,0,0],
            [1,0,0,1,0,1],
            [0,0,1,1,0,0],
            [0,0,1,0,0,0],
            [0,0,0,1,0,1],
            [0,0,0,1,0,0]
           ]
    matr2=[]
    
    for i in range(0,len(matr),2):
        m = [x or y for x,y in zip(*matr[i:i+2])]
        matr2.append([x or y for x,y in zip(m[::2],m[1::2])])
    print(matr2)
    

    结果:

    [[1, 1, 1], 
     [0, 1, 0], 
     [0, 1, 1]]
    

    UPD

    对于其他压缩级别,必须部分重写此代码。例如,压缩 9 倍,结果如下:

    matr = [[0,0,0,1,0,0],
            [1,0,0,1,0,1],
            [0,0,1,1,0,0],
            [0,0,0,0,0,0],
            [0,0,0,1,0,1],
            [0,0,0,1,0,0]
           ]
    matr2=[]
    
    for i in range(0,len(matr),3):
        m = [x or y or z for x,y,z in zip(*matr[i:i+3])]
        matr2.append([x or y or z for x,y,z in zip(m[::3],m[1::3],m[2::3])])
    print(matr2)
    

    结果:

    [[1, 1], 
     [0, 1]]
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5