簡體   English   中英

如何安全地將整數矩陣預分配為numpy中的索引矩陣

[英]How do I safely preallocate an integer matrix as an index matrix in numpy

我想預分配一個整數矩陣來存儲在迭代中生成的索引。 在MATLAB中,這可以通過for循環之前的IXS = zeros(r,c)來獲得,其中rc是行數和列數。 因此for可以將后續for循環中的所有索引分配給IXS以避免動態分配。 例如,如果我不小心在代碼中選擇了0,這是錯誤地選擇這些索引以從矩陣中選擇元素的方式,則可能會出現錯誤。

但是在numpy中,0或其他負值也可以用作索引。 例如,如果我預分配IXSIXS=np.zeros([r,c],dtype=int)在numpy的。 for循環中,可以通過MATLAB中的X(:,IXS(IXS~=0))獲得先前分配給IXS的索引所指定的子矩陣,但是如果我在同一行中執行選擇,則第一行/列可能會丟失在numpy的方式。

此外,在具有大型矩陣運算的大型程序中,預分配對於加快計算速度很重要,而且由於在MATLAB中可以選擇0,因此很容易定位因錯誤索引而引起的錯誤。 在numpy中,如果我通過錯誤的n選擇X[:,IXS[: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

numpy中等效於matlb的zerosnumpy.zeros

返回給定形狀和類型的新數組,並用零填充。

如果您真的想以這種方式捕獲錯誤,請使用NaN初始化索引。

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

這將始終引發IndexError

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM