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维列表。然后,一旦列表完成,您就可以将其转换为数字数组。
相关文章