我想预分配一个整数矩阵来存储迭代中生成的索引。在 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
我是一名优秀的程序员,十分优秀!