gpt4 book ai didi

python - 如何创建动态数组

转载 作者:太空狗 更新时间:2023-10-29 16:56:27 25 4
gpt4 key购买 nike

据我了解,Python 中的 list 类型是一个动态指针数组,当向其追加项目时,它会增加其容量。而NumPy中的数组使用一 block 连续的内存区域来保存数组的所有数据。

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

我可以创建一个类,其中包含一个 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() 返回的所有 View 都将保存旧数组。

编辑:数组模块中的数组类型是动态数组。下面程序测试list和array的增长因子:

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()

enter image description here

从图上看:list的增长倍数比array大。

最佳答案

您可能有兴趣知道 Python 标准库还包含一个 array听起来正是您想要的模块:

This module defines an object type which can compactly represent an array of basic values: characters, integers, floating point numbers. Arrays are sequence types and behave very much like lists, except that the type of objects stored in them is constrained.

关于python - 如何创建动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6950456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com