如何在无Numpy的MicroPython环境中用0填充三维数组
解决MicroPython中RGB LED矩阵三维零数组创建问题
我正在使用MicroPython通过微控制器控制RGB LED矩阵,无法使用Numpy创建数组。为了让其余代码能调用对应位置的数据,需要用0填充该三维数组。希望能通过函数实现,以适配不同尺寸的LED面板。
目前我手动编写数组,但这种方式不具备扩展性,还会大幅拖慢编辑器速度。我尝试过用函数实现,但不知如何添加值而非引用,代码如下:
def setbase(): base2 = [] for y in range(WIDTH): base2.insert(y,[0,0,0]) for x in range(HEIGHT): base.insert(x,base2)
问题根源
你写的代码里,base2是同一个列表对象,每次往base里插入的都是它的引用——也就是说base里所有行其实指向同一个列表,改其中一行的RGB值,所有行都会跟着变,这显然不是你想要的效果。
正确实现方式
下面两种方法都能生成独立的三维零数组,还能通过参数适配不同尺寸的LED面板:
方法1:嵌套循环写法
def create_rgb_matrix(width, height): rgb_matrix = [] # 遍历高度方向的每一行 for _ in range(height): current_row = [] # 遍历宽度方向的每个像素 for _ in range(width): # 每次新建一个[0,0,0]列表,避免引用复用 current_row.append([0, 0, 0]) rgb_matrix.append(current_row) return rgb_matrix # 示例:创建宽16、高12的LED矩阵数组 matrix = create_rgb_matrix(16, 12)
方法2:列表推导式(更简洁高效)
MicroPython支持列表推导式,这种写法更紧凑:
def create_rgb_matrix(width, height): # 外层循环控制行数,内层控制每行的像素数,每个像素都是独立的[0,0,0] return [[[0, 0, 0] for _ in range(width)] for _ in range(height)] # 示例:创建宽8、高8的矩阵 matrix = create_rgb_matrix(8, 8)
用这两种方法生成的数组,每个像素的[0,0,0]都是独立的对象,修改任意位置的值都不会影响其他像素,而且可以灵活调整width和height参数适配不同面板。
内容的提问来源于stack exchange,提问作者Macwa
相关产品推荐
相关产品推荐

