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

标签 python numpy

我想预分配一个整数矩阵来存储迭代中生成的索引。在 MATLAB 中,这可以通过 for 循环之前的 IXS = zeros(r,c) 获得,其中 rc 是行数和列数。因此,后续 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

关于python - 如何安全地将整数矩阵预分配为 numpy 中的索引矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41534489/

相关文章:

Python获取图像矩阵PIL

python - Numpy:如何将 (4, ) 数组和 (9, 9) 数组添加到 (9, 9, 4) 数组?

python - 单击按钮时如何禁用按钮?

python - 如何初始化具有给定维数的空 Numpy 数组?

python - 对多个目录中的模块使用 __init__.py

python - 如何从漂亮的表格中保存表格?

python - 在 matplotlib 中的垂直线旁边添加文本

python - scrapy从嵌套表内的图像标题属性获取文本

python - 将数字映射到它们的百分位数

python - 'numpy.float64' 对象不可迭代