NumPy中有动态数组吗?

问题描述

假设我创建了两个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

索引错误:索引%n超出大小为0的轴0的界限

我知道为什么会发生这种情况,因为A1中没有定义的位置[n,m],这是有意义的,但我的问题如下:

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

它不一定要在NumPy中,任何可以更新数组大小的库或方法都会很棒。如果它是一个方法,我可以想象有一个if循环,它检查[n][m]是否越界并对其采取措施。

我来自于一个很容易做到这一点的MatLab背景。我试图在numpy.array中的文档中找到有关这方面的信息,但没有成功。

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


解决方案

这不能在NumPy中完成,从技术上讲也不能在MatLab中完成。MatLab在幕后所做的是创建一个全新的矩阵,然后将所有数据复制到新矩阵中,然后删除旧矩阵。这是而不是动态调整大小,由于数组/矩阵的工作方式,这实际上是不可能的。这是非常慢的,特别是对于大型数组,这就是为什么现在MATLAB警告你不要这么做的原因。

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

与MATLAB不同,Python实际上确实有一个真正可调整大小的数据结构:list。列表仍然需要有足够的元素,因为这避免了在MATLAB中很难捕获的静默索引错误,但您可以以非常好的性能调整数组的大小。您可以通过使用列表的嵌套列表来创建有效的n维列表。然后,一旦列表完成,您就可以将其转换为数字数组。

相关文章