2009-11-12 55 views
2

我已經使用NumPy作爲我的碩士論文。我已經從MATLAB代碼的代碼轉換的部件,但是我有在與NumPy/Python的疑慮,當我參考:只是好奇從NumPy功能的結果!

m = numpy.ones((10,2)) 
m[:,0] 

它返回:

array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) 

並且當I REF到:

m[:,0:1] 

返回:

array([[ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.], 
     [ 1.]]) 

我認爲它應該是,與MATLAB產生相同的結果!

+1

如果你校對你的問題並正確格式化,這將會非常有幫助。 – jhwist 2009-11-12 19:00:35

+0

哎呀,對不起:) :) – vernomcrp 2009-11-12 19:13:31

+0

這應該有點幫助,雖然我還是不明白這個問題! – Amro 2009-11-12 19:28:13

回答

0

我忘了numpy是做什麼的,但是matlab從1開始索引矢量,而不是0.所以array(:,0)是Matlab中的一個錯誤。

3

我自己還在學習Python,但我認爲切片的工作方式是索引指向中間的位置,因此0:1只能讓您獲得第一列。這是你問的嗎?

這就是documentation不得不說:

一種方式來記住片的工作是如何 聯想到指數爲指向字符之間 ,與左邊的第一個字符的 編號爲0 。 然後最後 字符的n個字符的字符串的 具有索引n,例如右邊緣:

+---+---+---+---+---+ 
| H | e | l | p | A | 
+---+---+---+---+---+ 
0 1 2 3 4 5 
-5 -4 -3 -2 -1 
+0

沒有m [:,0:1]是相當於問題中所示的matlab語句 - 這提取了列0,相當於在Matlab中的列1。 0:2是一個覆蓋層,0,1是兩列(所以在這種情況下整個數組) – robince 2009-11-12 20:05:20

+0

我認爲這是什麼OP試圖做,因爲(除了開始索引)在MATLAB:'m( :,1:2)'給你兩列,而在Python/NumPy中:'m [:,0:1]'返回一列。我想這是要澄清的東西.. – Amro 2009-11-12 20:12:58

+0

同意它的不清楚 - 我讀問題,因爲詢問關於提取一列 - 在matlab m(:,1)給出一個2d列向量 - 同m [:,0: 1]在numpy,但m [:,0]在numpy給出一個1D數組 - 我認爲這個問題是爲什麼這是不同的matlab,但切片翻譯如你所說... – robince 2009-11-12 20:32:17

5

這是因爲numpy具有Matlab沒有的1d數組的概念。再加上numpys broadcasting這提供了一個強大的簡化(不用擔心隨處插入轉置),但意味着你必須考慮從Matlab轉換一點點。在這種情況下,使用標量Numpy提取單個列將結果簡化爲1d數組 - 但使用切片保留原始維度。如果你想更接近Matlab的語義,你可以嘗試使用Matrix類。詳情請參閱NumPy for matlab users頁面。在這種情況下,你可以做以下任一操作:

m[:,0][:,newaxis] # gives same as matlab 
np.matrix(m)[:,0] # gives same as matlab 

但請記住,如果你使用的矩陣類*變成矩陣乘法,你需要使用multiply()爲按元素。 (這在Matlab用戶頁面的NumPy中都有介紹)。一般來說,我會建議嘗試習慣於使用1d陣列,你會在matlab中有列或行向量,並且通常情況下工作。將它們重組爲二維數組時,您只需要擔心列與行。

你可能會感興趣的自動matlab到python轉換器,如OMPC(paper)(我認爲也有其他人)。

+0

ohh,太棒了,我明白了:D,非常感謝thrope! – vernomcrp 2009-11-12 20:24:08

+2

沒問題...如果你覺得這個回答的問題,你可以點擊答案接受它滴答滴答:) – robince 2009-11-12 20:33:14