Skip to main content
 首页 » 编程设计

python之如何安全地将整数矩阵预分配为 numpy 中的索引矩阵

2025年05月04日23开发

我想预分配一个整数矩阵来存储迭代中生成的索引。在 MATLAB 中,这可以通过 for 循环之前的 IXS = zeros(r,c) 获得,其中 r 和 c 是行数和列数。因此,后续 for 循环中的所有索引都可以分配给 IXS 以避免动态分配。如果我不小心在我的代码中选择了 0,例如,错误地选择这些索引以从矩阵中选择元素,就会出现错误。

但在 numpy 中,0 或其他负值也可以用作索引。例如,如果我在 numpy 中将 IXS 预分配为 IXS=np.zeros([r,c],dtype=int)。在for循环中,可以通过X(:,IXS(IXS~=0))获取之前分配给IXS的索引指定的子矩阵> 在 MATLAB 中,但如果我在 numpy 中以相同的方式执行选择,第一行/列可能会丢失。

此外,在大型矩阵运算的大型程序中,预分配对于加快计算速度很重要,并且很容易定位错误索引引起的错误,因为在MATLAB中可能会选择0。在 numpy 中,如果我通过 X[:,IXS[:n]] 选择一个错误的 n 数组,则不会发生错误。我必须花很多时间来检查错误在哪里。更糟糕的是,如果最终结果不是那么奇怪,我可能会忽略这个错误。这总是发生在我的程序中。因此我不得不一次又一次地调试我的代码。

我想知道有没有一种安全的方法可以在 numpy 中预分配这样的索引矩阵?

请您参考如下方法:

如何用明显太大的值填充索引数组:

In [156]: x=np.array([1,2,3,4,5]) 
In [157]: idx=np.full(6,999,dtype=int) 
In [158]: idx[:3]=[1,0,4] 
In [159]: idx 
Out[159]: array([  1,   0,   4, 999, 999, 999]) 
In [160]: x[idx[:3]] 
Out[160]: array([2, 1, 5]) 
In [161]: x[idx[:4]] 
... 
IndexError: index 999 is out of bounds for axis 1 with size 5