是否存在可调整大小的numpy.array等效实现?
可动态扩容的numpy数组等效实现方案
针对你的需求,有两种成熟的高性价比实现方案:
方案1:手动实现预分配扩容的动态数组(无额外依赖,性能最优)
该实现逻辑和Python list底层扩容逻辑一致,预分配大于实际使用长度的numpy数组,空间不足时按固定倍数扩容,append均摊时间复杂度为O(1),内存开销和原生numpy数组完全一致。
示例实现:
import numpy as np class DynamicNumpyArray: def __init__(self, dtype=np.float64, init_capacity=10): self._dtype = dtype self._capacity = init_capacity self._used_size = 0 self._buffer = np.empty(init_capacity, dtype=dtype) def append(self, value): # 空间不足时扩容为原容量的2倍 if self._used_size == self._capacity: self._capacity *= 2 new_buffer = np.empty(self._capacity, dtype=self._dtype) new_buffer[:self._used_size] = self._buffer self._buffer = new_buffer self._buffer[self._used_size] = value self._used_size += 1 @property def numpy_array(self): # 仅返回已填充的有效数据切片,和普通numpy数组完全兼容 return self._buffer[:self._used_size]
使用方法:
my_array = DynamicNumpyArray(dtype=np.int32) my_array.append(5) # 提取原生numpy数组 real_np_arr = my_array.numpy_array
方案2:使用Python标准库array模块
如果仅需要存储基础数值类型、不需要中间做numpy运算,可直接用标准库的array.array,它是连续存储的动态数组,内存开销远低于Python list,支持原生append方法,最终可直接转为numpy数组:
import array import numpy as np # 类型码'i'对应有符号整型,其他类型可查官方array模块文档 my_arr = array.array('i') my_arr.append(5) # 转换为numpy数组 np_arr = np.array(my_arr)
注意事项
不推荐直接使用np.append:该方法每次调用都会重新分配全量内存、拷贝所有已有数据,时间复杂度为O(n),批量append时总复杂度为O(n²),数据量稍大就会出现严重的性能问题。
如果能提前预估数据的最大长度,直接预分配固定大小的numpy数组、用索引写入数据的性能会比动态扩容更好。
内容的提问来源于stack exchange,提问作者Adam Jenča
相关产品推荐
相关产品推荐

