![](/img/trans.png)
[英]How do I preallocate a matrix of any size and fill it in a for loop in Python
[英]How do I safely preallocate an integer matrix as an index matrix in numpy
我想預分配一個整數矩陣來存儲在迭代中生成的索引。 在MATLAB中,這可以通過for
循環之前的IXS = zeros(r,c)
來獲得,其中r
和c
是行數和列數。 因此for
可以將后續for
循環中的所有索引分配給IXS
以避免動態分配。 例如,如果我不小心在代碼中選擇了0,這是錯誤地選擇這些索引以從矩陣中選擇元素的方式,則可能會出現錯誤。
但是在numpy中,0或其他負值也可以用作索引。 例如,如果我預分配IXS
如IXS=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的zeros
是numpy.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.