2017-02-01 86 views
0

新的數組大小和值我有輸出以下Python代碼:覆蓋陣列大小與在python

# Somecode block before 
##################### 
print np.shape(data2['sac']['startx'][0][0]) 
print np.shape(startx_buff) 
# New Completed Assignment 
data2['sac']['startx'][0][0][0] = startx_buff 

#**shape of data2['sac']['startx'][0][0] = (2, 119, 20)** 

#**shape of startx_buff = (2,120,20)** 

#***Error: data2['sac']['startx'][0][0][0] = startx_buff 

ValueError異常:不能從廣播形狀(2,120,20)進入形狀輸入陣列(119,20 )***

而我基本上想覆蓋​​條目有(2,120,20)尺寸(以及值startx_buff)。原因:後處理後,我注意到一個輸入值丟失。在MATLAB中,這是沒有問題的,因爲它更靈活,我可以通過分配一個新的值和數組/單元格形狀來重新定義一個變量。但是,其他的事情我在Python已經嘗試的解決方法,犯規的工作是:

del data2['sac']['startx'][0][0] 
data2['sac']['startx'][0][0] = np.empty((2,120,20)) 
#Error: won't let me delete all the values in the array 

我不太確定的解決方案是什麼,或者甚至在尋找什麼在線(我試圖尋找覆蓋/重載數組大小)。除了找到這個問題的答案之外,這個問題的正確術語是什麼?

回答

0

解決方案和錯字(爲威廉標):

data2['sac']['startx'][0][0] = startx_buff 

該指數下降了由[0]

1

用更簡單的名稱(我們並不需要所有的字典索引)你所要做的是:

In [212]: X = np.zeros((2,119,20),int) 

In [214]: y = np.ones((2,120,20),int) 
In [215]: X[0,:,:] = y 
...  
ValueError: could not broadcast input array from shape (2,120,20) into shape (119,20) 

MATLAB確實允許這種自動尺寸的增長,但如果是這種靈活不知何故,我懷疑。那會很危險。當我在MATLAB工作時從不依賴於這種行爲。在任何情況下,numpy都希望完全匹配 - 在廣播規則中(這增加了MATLAB不具備的許多功能(或者至少沒有)。

問題是,X[0,:,:](我增加了:爲了清晰讀者)是一個(119,20)槽。 (2,120,20)塊沒有辦法適合那裏。

這不工作(減少LHS所以它適合):

X[0,:,:] = y[0, :119, :] 

我們也可以成長X與串連

In [219]: X1 = np.concatenate((X, np.zeros((2,1,20),int)), axis=1) 
In [220]: X1.shape 
Out[220]: (2, 120, 20) 
In [221]: X1[0,:,:] = y[0,:,:] 

resize也可以,但是concatenate在填充提供了更多的控制值:

In [222]: np.resize(X, (2,120,20)).shape 
Out[222]: (2, 120, 20) 

np.empty((2,120,20))是一個完整的陣列。只有在數值未指定的意義上,它纔是空的。 numpy沒有列表的等效,x[1:3]=[](以及有一個np.delete函數。)

​​表達是有點不清楚。在Python中,它看起來像是幾級字典訪問,然後是幾級列表索引。

請記住,numpy的陣列大致相當於MATLAB矩陣和Python列表更像MATLAB細胞。列表像單元格可以容納任何東西,包括數組。

In [227]: alist[0]=np.arange(3) 
In [228]: alist 
Out[228]: [array([0, 1, 2]), [2, 3], None]