Python如何使用两个2D NumPy数组正确初始化3D数组
问题原因与解决方法
赋值失效的核心原因
- 你对Python列表切片索引的逻辑理解有误:
c[:][:][0]不是「取所有行、所有列、第三个维度第0位」的效果。Python原生列表的连续切片是按顺序作用在前一次返回的结果上的:c[:]先返回整个c的浅拷贝(是长度为2的列表,对应你定义的range(2)维度),再对这个结果做[:]还是返回它本身,最后的[0]取的是这个长度为2的列表的第0个元素,也就是一个形状为[640,6]的二维列表。你直接把NumPy数组赋值给这个位置,相当于把原本的二维列表替换成了NumPy数组对象,并没有修改列表内部的元素值,所以打印全0的列表时看不到赋值效果。 - 你混用了Python原生列表和NumPy数组的操作逻辑:原生列表不支持NumPy的广播、逐元素赋值语法,就算索引写对了,直接把数组赋值给列表切片也不会自动把数组元素填充到列表的每个位置。
正确实现方法
方法1:直接生成NumPy 3D数组(推荐,性能更高,后续操作更方便)
你需要的3D数组形状为(2, 640, 6),直接用np.stack一行即可实现,不需要提前定义空列表:
import numpy as np # 沿新的第0维堆叠a和b,生成形状为(2,640,6)的3D数组 c = np.stack([a, b], axis=0)
如果你需要维度顺序为(640,6,2),把axis参数改成2即可。
方法2:如果你确实需要用原生Python三维列表存储值
你可以先把NumPy数组转成嵌套列表,再直接替换对应维度的元素:
# 替换c对应维度的二维列表 c[0] = a.tolist() c[1] = b.tolist()
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

