2017-05-05 103 views
1

我有這個MATLAB代碼,我需要翻譯成python,但在創建一個新的列在發射陣列中有一個問題。在MATLAB中,代碼創建了一個最初爲空的n * 2矩陣,我希望能夠在python中執行相同的操作。使用NumPy,我創建了fired = np.where(v >= 30)。然而蟒蛇創建一個元組,而不是一個陣列,它拋出一個錯誤:試圖將一個MATLAB數組轉換爲一個Python數組

TypeError: unsupported operand type(s) for +: 'int' and 'tuple' 

這是我在MATLAB代碼,我想轉換成Python

firings=[]; 
firings=[firings; t+0*fired, fired]; 

幫助表示讚賞!謝謝!

+0

您是否在使用NumPy,還是僅僅使用香草Python?另外,這個錯誤非常直截了當。 ''''''是一個'元組',並且你正試圖給一個元組添加一個整數。這個在vanilla Python中的操作是未定義的。 – rayryeng

+0

我正在使用NumPy。被解僱的價值來自:fired = np.where(v> = 30),其中v是一個n * 1向量。我如何確保發射被添加到發射? –

回答

1

np.where生成二維元件的元組,如果數組1D的性質。對於一維的情況下,你需要訪問的只有np.where結果的第一個元素:

fired = np.where(v >= 30)[0] 

然後,您可以繼續前進,拼接矩陣。還通過user @Divakar提供一個建議是使用np.flatnonzero這將等效找到非零值在NumPy的陣列和展平爲一維陣列,用於以下頭痛:

fired = np.flatnonzero(v >= 30) 

請注意該邏輯來連接不會如果fired中找不到匹配項,則工作。當您查看連接邏輯時,您需要考慮這一點。使用MATLAB的方便之處在於,您可以連接空矩陣,結果是無效的(顯然)。

另請注意,NumPy中沒有行向量或列向量的概念。它只是一個一維數組。如果您想專門強制數組成爲列向量,則需要在第二維中引入一個單軸,以便執行此操作。請注意,只有np.where爲您提供了匹配的結果,這纔有效。之後,您可以使用np.vstacknp.hstack垂直和水平連接陣列來幫助您完成所要求的操作。你要做的第一件事就是創建一個空白的二維數組,然後做什麼,我們只是覆蓋:

firings = np.array([[]]) # Create blank 2D array 

# Some code here... 
# ... 
# ... 

# fired = find(v >= 30); % From MATLAB 
fired = np.where(v >= 30)[0] 
# or you can use... 
# fired = np.flatnonzero(v >= 30) 

if np.size(fired) != 0: 
    fired = fired[:, None] # Introduce singleton axis 
    # Update firings with two column vectors 
    # firings = [firings; t + 0 * fired, fired]; % From MATLAB 
    firings = np.vstack([firings, np.hstack([t + 0*fired, fired])]) 

這裏np.size找到NumPy的數組中元素的總數。如果np.where的結果未生成結果,則fired中元素的數量應該爲0.因此,只有當v中至少有一個元素受制於v >= 30時,纔會執行if語句。

+1

'np.flatnonzero'對於'1D'病例可能更有表現力。 – Divakar

+0

@Divakar aha,用'np.where'代替它。當然! – rayryeng

0

如果使用numpy的,則可以定義一個ndarray:

import numpy as np 
firings=np.ndarray(shape=(1,2) 
firings[0][0:]=(1.,2.) 
firings=np.append(firings,[[3.,4.]],axis=0) 
相關問題