我正在嘗試將我已經構建到python環境中的一些Matlab庫。到目前爲止,我面臨的最大問題是基於索引規範的數組動態分配。例如,使用MATLAB,鍵入以下內容:Python動態數組分配,Matlab風格
x = [1 2];
x(5) = 3;
會導致:
x = [ 1 2 0 0 3]
換句話說,我沒有事先知道的(X),還是其內容的大小。數組必須根據我提供的索引實時定義。
在Python中,嘗試以下操作:
from numpy import *
x = array([1,2])
x[4] = 3
會導致以下錯誤:IndexError:索引越界。在變通辦法增加陣列中的循環,然後分配所需的值:
from numpy import *
x = array([1,2])
idx = 4
for i in range(size(x),idx+1):
x = append(x,0)
x[idx] = 3
print x
它的工作原理,但它是不是很方便,它有可能成爲n維arrays.I雖然有關子類ndarray非常繁瑣實現我的目標,但我不確定它是否會起作用。有人知道更好的方法嗎?
感謝您的快速回復。我不知道有關setitem方法(我對Python相當新)。我簡單地覆蓋了ndarray類如下:
import numpy as np
class marray(np.ndarray):
def __setitem__(self, key, value):
# Array properties
nDim = np.ndim(self)
dims = list(np.shape(self))
# Requested Index
if type(key)==int: key=key,
nDim_rq = len(key)
dims_rq = list(key)
for i in range(nDim_rq): dims_rq[i]+=1
# Provided indices match current array number of dimensions
if nDim_rq==nDim:
# Define new dimensions
newdims = []
for iDim in range(nDim):
v = max([dims[iDim],dims_rq[iDim]])
newdims.append(v)
# Resize if necessary
if newdims != dims:
self.resize(newdims,refcheck=False)
return super(marray, self).__setitem__(key, value)
它的作品就像一個魅力!但是,我需要修改上面的代碼,使得setitem允許改變維數以下這個請求:
a = marray([0,0])
a[3,1,0] = 0
不幸的是,當我嘗試使用這種numpy的功能
self = np.expand_dims(self,2)
返回的類型是numpy.ndarray而不是主要 .marray。任何想法,如果我可以強制執行那些numpy函數輸出marray如果提供marray作爲輸入?我認爲這應該是可行的使用array_wrap,但我永遠無法找到如何。任何幫助,將不勝感激。
你'append'-IN-循環算法需要二次方時間,所以對於大型數組來說它會變得非常慢。 – 2012-07-13 14:44:25
把它作爲一個機會來擺脫所有的特定數組重新分配;) – sebastian 2013-11-14 14:49:24
a)如果你不打算有稀疏值,即你想要順序設置它們,你可以像np.fromiter一樣。 b)如果你仍然打算使用子類ndarray,這篇文章應該清楚爲什麼這個類型不被保留,以及如何修復它http://docs.scipy.org/doc/numpy-1.10.1/user/basics.subclassing .html – Erik 2016-06-19 19:59:32