如何在numpy

时间:2017-01-08 15:45:44

标签: python numpy

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

numpy中的matlb zeros相当于numpy.zeros

  

返回一个给定形状和类型的新数组,用零填充。

答案 2 :(得分:1)

如果您真的想以这种方式捕获错误,请使用NaN初始化索引。

IXS=np.full((r,c),np.nan, dtype=int)

这将始终提升IndexError

答案 3 :(得分:1)

使用numpy.ma.masked_array

IXS=np.ma.masked_values(np.zeros((3,4),dtype=int),0)

masked_array(data =
 [[-- -- -- --]
 [-- -- -- --]
 [-- -- -- --]],
             mask =
 [[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]],
       fill_value = 0)

现在,如果您设置了一个值,则可以将其用作索引:

a=np.arange(10)
IXS[2,2]=5
a[IXS[2,2]]

5

但如果你不这样做:

IXS[0,0]

masked

a[IXS[0,0]]

IndexError: arrays used as indices must be of integer (or boolean) type