numpy中有动态数组吗?

问题描述 投票:0回答:1

假设我创建了2个numpy数组,其中一个是空数组,另一个大小为1000x1000,由零组成:

import numpy as np;
A1 = np.array([])
A2 = np.zeros([1000,1000])

当我想更改A2中的值时,这似乎可以正常工作:

A2[n,m] = 17

上面的代码会将A2中位置[n] [m]的值更改为17。

当我尝试使用A1进行上述操作时,出现此错误:

A1[n,m] = 17

IndexError:索引n超出大小为0的轴0的边界

我知道为什么会这样,因为在A1中没有定义的位置[n,m],这很有意义,但是我的问题如下:

如果n或m或两者都大于数组A的边界时输入A[n,m] = somevalue,是否有一种方法来定义动态数组而不用新的行和列更新数组?

不必一定是numpy,任何可以更新数组大小的库或方法都很棒。如果这是一种方法,我可以想象有一个if循环,它检查[n] [m]是否超出范围并对此进行处理。

我来自MATLAB背景,很容易做到这一点。我试图在numpy.array的文档中找到有关此内容的信息,但是我一直没有成功。

编辑:我想知道是否可以在Python中而不是仅在numpy库中以某种方式创建动态列表。从这个问题看来,它不适用于numpy Creating a dynamic array using numpy in python

python arrays numpy dynamic indexoutofboundsexception
1个回答
1
投票

这不能在numpy中完成,从技术上讲也不能在MATLAB中完成。 MATLAB在后台执行的操作是创建一个新矩阵,然后将所有数据复制到新矩阵,然后删除旧矩阵。它是[[not动态调整大小的,由于数组/矩阵的工作方式,实际上是不可能的。这非常慢,特别是对于大型数组,这就是为什么MATLAB现在警告您不要这样做。

像MATLAB一样,Numpy不能调整数组的大小(实际上,与MATLAB不同,它在技术上可以,但是只有在您幸运的情况下,我才建议您不要尝试)。但是,为了避免在MATLAB中造成这种混乱和缓慢的代码,numpy要求您显式创建新数组(使用np.zeros),然后将数据复制过来。

Python,与MATLAB不同,实际上确实具有真正可调整大小的数据结构:list。列表仍然需要有足够的元素,因为这样可以避免在MATLAB中难以捕获的无提示索引错误,但是您可以调整数组的大小,从而获得非常好的性能。您可以使用列表的嵌套列表来制作有效的n维列表。然后,列表完成后,可以将其转换为numpy数组。

© www.soinside.com 2019 - 2024. All rights reserved.