据我所知,Python中的list
类型是一个动态指针数组,当项目附加到它时会增加它的容量。 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
但是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()
:列表的增加因子大于数组。
答案 0 :(得分:16)
您可能有兴趣知道Python标准库还包含一个array模块,听起来就像您想要的那样:
该模块定义了一个可以紧凑地表示的对象类型 基本值数组:字符,整数,浮点数。 数组是序列类型,其行为与列表非常相似,除此之外 存储在其中的对象类型受到约束。