1. 程式人生 > >Matlab與Python的語法比較

Matlab與Python的語法比較

          由於本人對Python和Matlab都不是十分熟,而由於工作兩個工具都要用,經常困惑於兩者的相似性。現總結如下:

          <一> Python的Dictionary和Matlab的struct的簡單比較

                Matlab的struct叫做Dictionary也許更合適一些.

            Python中定義Dictionary

>>> d = {"server":"mpilgrim", "database":"master"}

      Matlab中建立struct:

>> d = struct('server','mpilgrim', 'database','master')

      在Python中通過key來查詢value:

>>> d["server"]
'mpilgrim'
>>> d["database"]
'master'

      在Matlab中通過字串形式的fieldname來查詢value(Using Dynamic Field Names):

>> d.('server')

ans =

mpilgrim

>> d.('database')

ans =

master

                在Python中不能通過value來獲取key:

                >>> d["mpilgrim"]
                     Traceback (innermost last):
                     File "<interactive input>", line 1, in ?
                     KeyError: mpilgrim

              在Matlab中也不行(不能通過value來查詢fieldname):

                 >> d.('mpilgrim')
                      ??? Reference to non-existent field 'mpilgrim'.

               在Python中修改已經存在的key的value:

               >>> d["database"] = "pubs"
              >>> d
                 {'server': 'mpilgrim', 'database': 'pubs'}

             在Matlab中修改已經存在的field的value:

                >> d.('database')='pubs'

                d =

                   server: 'mpilgrim'
                  database: 'pubs'

                在Python中新增新的key-value對:

              >>> d["uid"] = "sa"
              >>> d
                      {'server': 'mpilgrim', 'uid': 'sa', 'database': 'pubs'}

              在Matlab中新增新的field:

               >> d.('uid')='sa'

               d =

                      server: 'mpilgrim'
                      database: 'pubs'

              在Python中刪除Dictionary的元素:

             >>> d
                       {'database': 'master', 'uid': 'sa', 'server': 'mpilgrim'}
              >>> del d['uid']
             >>> d
                     {'database': 'master', 'server': 'mpilgrim'}

              在Matlab中刪除stuct的field:

             >> d=struct('database', 'master', 'uid', 'sa', 'server', 'mpilgrim')

             d =

                 database: 'master'
                 uid: 'sa'
                server: 'mpilgrim'

             >> d=rmfield(d,'uid')

                  d =

                    database: 'master'
                   server: 'mpilgrim'

           在Python中刪除Dictionary所有元素:

                >>> d.clear()
                >>> d
                         {}

              在Matlab中刪除struct所有field:

               >> d=struct()

                    d =

                       1x1 struct array with no fields.

          但是兩者(Python的Dictionary和Matlab中的struct)還是有許多差異的,例如:

          在Python中,key可以使用多種型別:

          >>> d[42] = "douglas"
          >>> d
                  {'server': 'mpilgrim', 'uid': 'sa', 'database': 'master',42: 'douglas', 'retrycount': 3}

         在Matlab中,甚至不能用數字作為field name:

         >> d.123='123'
             ??? d.123='123'
                 |
              Error: Missing MATLAB operator.

         >> d.(123)='123'
               ??? Argument to dynamic structure reference must evaluate to a valid field name.

         以上是對Python的Dictionary和Matlab的struct的簡單比較。

      <二>Python的List和Matlab的Cell Array比較

兩者的重要不同:Python的List的下標從0開始,Matlab的Cell Array的下標從1開始

      Python中List的定義:

>>> li = ["a", "b", "mpilgrim", "z", "example"]
>>> li
['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[0]           
'a'
>>> li[4]       
'example'

      Matlab中Cell Array的定義:

>> li = {'a', 'b', 'mpilgrim', 'z', 'example'}

li =

    'a'    'b'    'mpilgrim'    'z'    'example'

>> li(1)

ans =

    'a'

>> li(5)

ans =

    'example'

      兩者的定義和使用是類似的,只是注意下標,一個從0開始,一個從1開始。

      Python中可使用負的List索引,但Matlab中不能用負數來索引Cell Array,兩者在此是不同的,就不再舉例了。

      <三>slice(分片)

      Python中List的slice:

>>> li[0:3]
['a', 'b', 'mpilgrim']

      0:3表示得到下標為0、1、2的List元素。

      在Matlab中想要對Cell Array 實現類似的效果要這樣做:

>> li(1:3)

ans =

    'a'    'b'    'mpilgrim'

      這裡1:3是一個向量(1,2,3),用這個向量作為下標對li進行索引。

      由此可見在Slice這個功能上Python和Matlab很相似但也有很大不同。

        Slice的簡寫:

       在Python中:

   >>> li[:3]
['a', 'b', 'mpilgrim']
>>> li[3:]
['z', 'example']

      但是在Matlab中不能這樣做,只能寫成:

>> li(1:3)

ans =

    'a'    'b'    'mpilgrim'

>> li(4:end)

ans =

    'z'    'example'

      <4>在末尾追加元素

      在Python中對List,可以使用append和extend來實現,但兩者功能有所不同,append用來追加單個元素,extend用來進行List的連線

      在Python中對List使用extend:

>>> li = ['a', 'b', 'c']
>>> li.extend(['d', 'e', 'f'])
>>> li
['a', 'b', 'c', 'd', 'e', 'f']
>>> len(li)           
6

      在Matlab中對Cell Array實現類似的效果:

>> li={'a','b','c'}

li =

    'a'    'b'    'c'

>> li=[li {'d','e','f'}]

li =

    'a'    'b'    'c'    'd'    'e'    'f'

>> numel(li)

ans =

     6

      在Python中對List使用append:

>>> li = ['a', 'b', 'c']
>>> li.append(['d', 'e', 'f'])
>>> li
['a', 'b', 'c', ['d', 'e', 'f']]
>>> len(li)      
4
>>> li[-1]
['d', 'e', 'f']

      在Matlab中對Cell Array實現類似效果:

>> li={'a','b','c'}

li =

    'a'    'b'    'c'

>> li{end+1}={'d','e','f'}

li =

    'a'    'b'    'c'    {1x3 cell}

>> numel(li)

ans =

     4

>> li{end}

ans =

    'd'    'e'    'f'

  至於Python中對List的搜尋功能,我沒有在Matlab中找到對應的函式,也許需要自己去實現吧。

<五>下面再看一下格式化字串。

      Python和Matlab都使用C語言的風格來實現格式化字串:

      Python中:

>>> k = "uid"
>>> v = "sa"
>>> "%s=%s" % (k, v)
'uid=sa'

      Matlab中:

>> k='uid';
>> v='sa';
>> sprintf('%s=%s',k,v)

ans =

uid=sa

      再看看Python中List的解析:

>>> li = [1, 9, 8, 4]
>>> [elem*2 for elem in li]
[2, 18, 16, 8]

      在Matlab中這種操作對於Numeric Matrix實在是太容易了,但對於Cell Array怎樣操作,我不太清楚,只有先轉換成Numeric Array才好:

>> li={1,9,8,4};
>> numli=zeros(1,numel(li));
>> for n=1:numel(numli)
numli(n)=li{n};
end
>> numli*2

ans =

     2    18    16     8

      再看一個比較綜合的例子:將一個Dictionary中的所有key-value對進行格式化字串處理,結果儲存在一個List中:

      在Python中:

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa"}
>>> li=["%s=%s" % (k, v) for k, v in params.items()]
>>> li
['database=master', 'uid=sa', 'server=mpilgrim']

      使用item方法,來得到Dictionary中所有的key-value對。

      我對Matlab的運用還不夠熟練,沒有找到簡潔的實現類似功能的方法,只好使用一個迴圈:

>> li=[]

li =

     []

>> params = struct('server','mpilgrim', 'database','master', 'uid','sa')

params =

      server: 'mpilgrim'
    database: 'master'
         uid: 'sa'

>> names=fieldnames(params);
>> for n=1:numel(names)
li{n}=sprintf('%s=%s',names{n},params.(names{n}));
end
>> li

li =

    'server=mpilgrim'    'database=master'    'uid=sa'

      將params資料儲存在struct裡,實現類似Python中Dictionary的功能,用fieldnames函式得到一個儲存著params結構體所有field name的Cell Array,利用sprintf來實現格式化字串操作。在sprintf中使用字串形式的field name來引用域(Using Dynamic Field Names)。最後的結果li是一個Cell Array。

      下面再討論一下lambda:

      Python中使用lambda函式:

>>> g = lambda x: x*2
>>> g(3)
6

      在Matlab中實現:

>> [email protected](x)x*2;
>> g(3)

ans =

     6

      在Python中還可這樣用:

>>> (lambda x: x*2)(3)
6

      但是Matlab中好像不行:

>> @(x)x*2(3)
??? @(x)x*2(3)
           |
Error: Unbalanced or misused parentheses or brackets.

相關推薦

MatlabPython語法比較

          由於本人對Python和Matlab都不是十分熟,而由於工作兩個工具都要用,經常困惑於兩者的相似性。現總結如下:           <一> Python的Dictionary和Matlab的struct的簡單比較            

javagolang語法比較(一)

變數宣告與賦值 Java int i; // 宣告 int j = 1; // 宣告+賦值 Go var i int // 宣告 i := 1 // 宣告+賦值 變數宣告:var是關鍵字,格式:var 變數名稱 變數

MongoDB語法SQL語法比較

MongoDB語法 MySql語法 db.test.find({‘ID’:10}).count() select count(*) from test where ID=10 db.test.find({‘name’:‘foobar’}) s

Python-06:Python語法基礎-數字符串

com -1 進行 距離 Coding 開始 mage gin spl 1、數的類型   Python中數的類型主要是有5中,分別有整數型(int)、長整型(long)、浮點型(float)、布爾型(bool)、復數型(complex)   例如: 0 -1 1 -9

Python-10:Python語法基礎-運算符表達式

輸出 false col 先後 邏輯與 尋址 分享 hello 邏輯或 1、Python運算符簡介   1)什麽是運算符     在Python中經常需要對一個或多個數字進行操作,2+3中的+是運算符,"hello"*20中的*也是運算符   2)運算符有哪些     + 

python性能優化、內存優化、內存泄露;其他語音比較效率如何?

語音 gpo .org .html www. com log .cn amp 1、內存泄露:http://www.cnblogs.com/xybaby/p/7491656.html 2、內存優化:http://www.cnblogs.com/xybaby/p/7488216

python 語法錯誤異常

問題 ber 信息 nbsp 解釋 num 了解 判斷 god 語法錯誤與異常 語法錯誤,例如: while True print(”my god“) 這面這裏錯的地方在於沒有加:冒號以及打印要換到第二行 異常,例如: num = 9 print("nummber

python簡介基礎語法

twisted 版本 lse 組合 ack list 針對 如果 rap 1. python簡介: python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。 python由Guido van Rossum與1989年底發明,第一個公開發行版發行與1991

C語言檔案操作Python檔案操作的比較

無論是在C語言中還是在Python中,對檔案的操作都是直接實現了計算機內部與外部之間的互動; 通過將資料寫入檔案可以更好地實現資料的儲存,而不會在程式結束之後資料隨之消失, 而通過檔案的讀取操作則可以更好地避免自己講大量資料的手動輸入程式。   本篇文章主要介紹C語言以

python進階:np.vectorizepandas apply比較

Py裡面很有趣的一個地方是達成目的不同方法之間的效率差異可以有好幾百倍,這樣的例子數不勝數,下面通過一個簡單的例子對比一下numpy的vectorize與pandas裡面的apply,雖然apply在用法上比vectorize多,但實際上apply對大於十萬行的資料處理已經是慢如蝸牛,別談大資料了,

python 語法:實現棧佇列

學資料結構的時候,用c語言實現棧與佇列可不容易。用python只要幾行程式碼就可以了,基於列表實現棧,基於雙端列表實現佇列。 棧(後進先出) stack = [1, 2, 3, 4] stack.append(5) # 入棧 stack.pop() # 出棧 佇列(先進先

python比較is==(轉載)

在 Python 中會用到物件之間比較,可以用 ==,也可以用 is 。但是它們的區別是什麼呢? is 比較的是兩個例項物件是不是完全相同,它們是不是同一個物件,佔用的記憶體地址是否相同。萊布尼茨說過:“世界上沒有兩片完全相同的葉子”,這個is正是這樣的比較,比較是不是同一片葉子(即比較的id是否相同,這i

【讀書1】【2017】MATLAB深度學習——代價函式比較(2)

如果你覺得很難趕上學習進度,不要氣餒。 If you had a hard time catching on, don’tbe discouraged. 事實上,在研究深度學習時,理解反向傳播演算法並不是一個至關重要的因素。 Actually, understa

Python IDE比較推薦

                水木上的一個帖子,作者:RunningOn (揮著翅膀的男孩)原文:http://www.newsmth.net/bbscon.php?bid=284&id=34874&ftype=11我先給一個初步的表格吧,大家如果有什麼意見,或有補充,歡迎提出。有些我沒有用

MatlabPython操作檔案路徑的一些函式的比較

轉自:http://blog.sina.com.cn/s/blog_4513dde60100o6mv.html Python作為一個用途廣泛的語言,提供了不少用於操作目錄和檔案路徑的方法。而Matlab雖然一開始是為了數學運算而設計的,但是同樣提供了不少操作路徑的函式,因為

MysqlMongoDB的語法比較(CRUD)

啟動服務: MySQL: net start MySQL MongoDB: net start MongoDB 關閉服務 MySQL: net stop MySQL MongoDB: net stop MongoDB 連線資料庫: MySQL: mysql -u使用者名

Python JavaScript 語法差異點

隨著人工智慧技術的普及,越來越多的前端程式設計師開始關注相關技術。Python 作為人工智慧領域最常用的語言,與前端程式設計師日常使用的語言 JavaScript 同屬指令碼語言,且在兩者發展過程中,社群也多有相互借鑑之處,因此有很多相似。一個熟悉 JavaScript 語言的前端程式設計師,

JS數組方法python列表方法的比較

pan 第一個 -i 插入元素 長度 remove spa splice result JS的數組(Array)與python的列表(List)很相似,本人因為之前學過JS,後來學習python感覺有些方法很容易混淆,這裏對常用的一些方法做些區分 增 刪 改 查 排序 逆

值得收藏,Python 語法速覽實戰清單!

    基礎語法   Python 是一門高階、動態型別的多正規化程式語言;定義 Python 檔案的時候我們往往會先宣告檔案編碼方式:     # 指定指令碼呼叫方式 #!/usr/bin/env pyt

python 中賦值 copy() ' = ' 號以及比較符'=='號 'is'

關於比較符號’==’號 與 ‘is’ 這裡主要是為下文鋪墊 == 比較操作符:用來比較兩個物件是否相等,value做為判斷因素 is 同一性運算子:比較判斷兩個物件是否相同,id做為判斷因素