You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在可调整大小的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:09:02