【问题标题】:Creating a dynamic array using numpy in python在 python 中使用 numpy 创建一个动态数组
【发布时间】:2017-10-16 08:57:35
【问题描述】:

我想创建一个没有大小规范的动态数组。在该数组中,我需要在我需要的任何位置插入元素。在它们获得分配给它的值之前,它们中的剩余值可以是 null 或 undefined。

例如:

a = np.array([])

np.insert(a, any index value, value)

所以,如果我使用np.insert(a, 5, 1),我应该得到如下结果:

array([null, null, null, null, null, 1])

【问题讨论】:

  • 你不能用 numpy 做到这一点
  • 您受限于机器的内存容量,因此没有您想要的动态数据结构。但是,如果你想要一个动态数据结构,它可以利用某个点(内存的最大容量)来增加它的大小,这不是你可以用 Numpy 数组做的。
  • 您必须为上述实现创建自己的数据结构。您可以使用None 初始化一定大小的数组,并以所需的方式实现插入。如果用户正在访问超出数据结构限制的索引,则可以通过将数组加倍来扩展数组。参考this
  • 用字典怎么样?
  • 您确实有 Python 中的标准 array 库,从所有意图和目的来看,它都是一个动态数组。至于你给insert 的具体行为,我怀疑它是否有效(换句话说,我认为插入不会自动添加空值)。我的建议是让你自己实现存储一个 numpy 数组(并使用它的方法来获得你需要的行为)。

标签: python arrays numpy


【解决方案1】:

在 MATLAB/Octave 中,您可以使用索引创建和扩展矩阵:

>> a = []
a = [](0x0)
>> a(5) = 1
a =
   0   0   0   0   1

也就是说,如果你索引一个超出当前端的槽,它会扩展矩阵,并用 0 填充它。

Javascript(在 Nodejs 会话中)做类似的事情

> var a = [1,2];
undefined
> a
[ 1, 2 ]
> a[6] = 1
1
> a
[ 1, 2, , , , , 1 ]
> a[3]
undefined

未定义中间槽。

Python 字典可以简单地通过索引来增长

In [113]: a = {0:1, 1:2}
In [114]: a[5]=1
In [115]: a
Out[115]: {0: 1, 1: 2, 5: 1}
In [116]: a[3]
...
KeyError: 3
In [117]: a.get(3,None)

字典还实现了setdefaultdefaultdict

Python list 增长了 appendextend

In [120]: a = [1,2]
In [121]: a.append(3)
In [122]: a
Out[122]: [1, 2, 3]
In [123]: a.extend([0,0,0,1])
In [124]: a
Out[124]: [1, 2, 3, 0, 0, 0, 1]

列表也可以通过del 和切片赋值来改变大小,例如a[1:2] = [0,0,0,2].

numpy 数组的大小是固定的。要增长一个,你必须通过连接创建一个新数组

In [125]: a = np.arange(3)
In [126]: a
Out[126]: array([0, 1, 2])
In [127]: a = np.concatenate((a, [0,0,1]))
In [128]: a
Out[128]: array([0, 1, 2, 0, 0, 1])

appendstackdeleteinsert 等数组函数使用某种形式的 concatenate 或 allocate-n-fill。

在有限的情况下,可以调整数组的大小(但这种方法不经常使用):

In [161]: a.resize(10)
In [162]: a[-1]=10
In [163]: a
Out[163]: array([ 0,  1,  2,  0,  0,  1,  0,  0,  0, 10])

【讨论】:

    【解决方案2】:

    查看this package

    from numpy_da import DynamicArray
    
    data = DynamicArray(shape=2, index_expansion=True)
    data[5] = 1
    print(data)  # [0, 0, 0, 0, 0, 1]
    

    index_expansion 选项允许数组在索引超出当前最大索引时增长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2017-12-27
      • 1970-01-01
      • 2023-01-25
      • 2023-02-21
      • 2021-08-15
      相关资源
      最近更新 更多