如何创建动态数组

HYR*_*YRY 16 python numpy list

据我所知,listPython中的类型是一个动态指针数组,当项目被附加到它时会增加它的容量.NumPy中的数组使用连续的内存区域来保存数组的所有数据.

是否有任何类型可以动态增加其作为列表的容量,并将值存储为NumPy数组?类似于C#中的List.如果类型具有与NumPy数组相同的接口,那就太棒了.

我可以创建一个包含NumPy数组的类,并在它完整时调整此数组的大小,例如:

class DynamicArray(object):
    def __init__(self):
        self._data = np.zeros(100)
        self._size = 0

    def get_data(self):
        return self._data[:self._size]

    def append(self, value):
        if len(self._data) == self._size:
            self._data = np.resize(self._data, int(len(self._data)*1.25))
        self._data[self._size] = value
        self._size += 1
Run Code Online (Sandbox Code Playgroud)

但DynamicArray不能用作NumPy数组,我认为在np.resize()之前get_data()返回的所有视图都将保留旧数组.

编辑:数组模块中的数组类型是动态数组.以下程序测试列表和数组的增加因子:

from array import array
import time
import numpy as np
import pylab as pl

def test_time(func):
    arrs = [func() for i in xrange(2000)]
    t = []
    for i in xrange(2000):
        start = time.clock()
        for a in arrs:
            a.append(i)
        t.append(time.clock()-start)
    return np.array(t)

t_list = test_time(lambda:[])
t_array = test_time(lambda:array("d"))
pl.subplot(211)
pl.plot(t_list, label="list")
pl.plot(t_array, label="array")
pl.legend()
pl.subplot(212)
pl.plot(np.where(t_list>2*np.median(t_list))[0])
pl.plot(np.where(t_array>2*np.median(t_array))[0])
pl.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

从图中可以看出:list的增加因子大于数组.

Ned*_*der 17

您可能有兴趣知道Python标准库还包含一个听起来就像您想要的阵列模块:

该模块定义了一个对象类型,它可以紧凑地表示一组基本值:字符,整数,浮点数.数组是序列类型,其行为与列表非常相似,只是存储在其中的对象类型受到约束.

  • @ user772649,实际上,看一下[源代码](http://hg.python.org/cpython/file/5b7e765ce049/Modules/arraymodule.c),我看到我错了 - `array`s确实被分配了.抱歉! 我应该更频繁地检查来源:) (3认同)