求助:使用Numpy.append向空数组追加同维度数组后结果仍为空的问题
解决Numpy数组追加无效的问题
嘿,我明白你遇到的麻烦了!咱们先拆解一下问题出在哪,再给你几个靠谱的解决方案:
问题核心原因
numpy.empty()不是“空数组”:你定义的reconstructed = numpy.empty((4096,))其实不是没有元素的空数组,它是一个已经包含4096个未初始化垃圾值的一维数组。numpy.append()不会原地修改数组:Numpy的append函数是返回一个新的数组,而不是直接修改原数组。你只是调用了numpy.append(...)但没有把返回结果重新赋值给reconstructed,所以原数组完全没变化。
正确的实现方式
根据你的需求(把一维数组写入/收集到数组中),分两种情况处理:
情况1:只需要写入第一个to_append数组
如果你的目标是直接用to_append替换掉初始的reconstructed,那根本不需要用append,直接赋值就行:
import numpy as np # 不需要用empty初始化,直接赋值 reconstructed = reconstruct(p, e_faces, weights, mu, i)
情况2:需要收集多个(4096,)形状的数组,最终组成二维数组
如果后续还要追加更多同形状的数组,更高效的做法是先用Python列表来收集,最后再转成Numpy数组(因为Numpy数组的扩容成本很高,列表动态扩容更高效):
import numpy as np # 初始化一个空列表来收集数组 reconstructed_list = [] # 假设你要循环收集多个to_append for ...: # 这里是你的循环逻辑 to_append = reconstruct(p, e_faces, weights, mu, i) reconstructed_list.append(to_append) # 最后把列表转成Numpy数组,形状会是(n, 4096),n是你收集的数组个数 reconstructed = np.array(reconstructed_list)
如果你一定要用Numpy的append(不推荐,效率低)
如果坚持要用np.append,必须把返回值重新赋值给变量,同时注意初始数组的状态:
import numpy as np # 如果要从真正的空数组开始,应该用np.array([]),而不是empty reconstructed = np.array([]) to_append = reconstruct(p, e_faces, weights, mu, i) # 赋值返回的新数组 reconstructed = np.append(reconstructed, to_append, axis=0) # 此时reconstructed的形状会是(4096,)
额外提醒
- 尽量避免频繁使用
np.append,因为每次调用都会创建新数组,复制原有数据,数据量大的时候会很慢。用列表收集再转数组是更优的方案。 numpy.empty()适合需要快速分配内存但后续会覆盖所有值的场景,不要把它当成“空容器”来用。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

