2010-01-20 129 views
3

我是一個Matlab用戶需要使用Python的一些事情,我真的很感激,如果有人可以幫助我走出Python語法:Python列表索引的元組

(1)這是真的,列表可以被Python中的元組索引?如果是這樣,我該怎麼做?例如,我想用它來表示一個數據矩陣。 (2)假設我可以使用由元組索引的列表,例如data [(row,col)],我該如何刪除整列?我知道在Matlab中,我可以做類似

new_data = [data(:,1:x-1) data(:,x+1:end)]; 

如果我想從數據中刪除列x。 (3)如何輕鬆地計算每行中的非負數元素的數量。例如,在Matlab中,我可以這樣做:

sum(data>=0,1) 

這會給我一個列向量,表示每行中的非負項的數量。

非常感謝!

+2

我不知道這是否與矩陣找到一個相當於Python的操作,但是,消除一整列,也可以使用語法'數據進行幫助(:,X)= [];'在MATLAB中。 – gnovice 2010-01-20 02:47:26

+1

謝謝大家! NumPy/SciPy正是我所需要的。語法非常接近Matlab。再次感謝您的幫助,我真的很感激! – 2010-01-20 23:12:53

+1

這不是很好嗎?如果你是Matlab用戶,那麼你會發現ipython與Numpy/Scipy絕對不可或缺。對我而言,面向對象(例如(data> = 0).sum()或data.size或data.shape())使Numpy/Scipy甚至比Matlab更好。 – 2010-01-20 23:52:24

回答

2

我同意每個人。使用Numpy/Scipy。但這裏有你的問題的具體答案。

  1. 是的。索引可以是內置列表或Numpy數組。假設x = scipy.array([10, 11, 12, 13])y = scipy.array([0, 2])。然後x[[0, 2]]x[y]都返回相同的東西。

  2. ​​

  3. (data>=0).sum(axis=1)

小心:實施例2示出了具有numpy的/ SciPy的一個常見的問題。如示例3所示,axis屬性通常設置爲0以沿陣列的第一維操作,1以沿第二維操作,依此類推。但是像delete這樣的一些命令實際上顛倒了維度的順序,如示例2所示。您知道,行主要對列主要。

8

你應該看看numpy,這是爲了這種事情。

+2

numpy將完成問題中提出的所有問題,語法與matlab幾乎完全相同。 – Autoplectic 2010-01-20 02:40:04

+1

Numpy陣列是要走的路。我推薦此頁面來幫助簡化轉換 - http://www.scipy.org/NumPy_for_Matlab_Users – 2010-01-20 06:22:08

3
  1. 不,但字母可以。
  2. 聽起來像你想要一個「二維數組」,矩陣類型,或其他東西。你看過numpy了嗎?
  3. 取決於您在#2中選擇的內容,但Python確實有sum以及其他直接在iterables上運行的函數。查看gen-exprs(生成器表達式)和列表解析。例如:
 
row_count_of_non_neg = sum(1 for n in row if n >= 0) 
# or: 
row_count_of_non_neg = sum(n >= 0 for n in row) 
# "abusing" True == 1 and False == 0 
0

(1) 我不認爲你可以使用一個元組的Python列表的索引。您可以使用列表列表(例如[i] [j]),但似乎這不是您的觀點。您可以使用鍵爲元組的字典。

d = { (1,1):1, (2,1):2 ... } 

(2) 如果你不介意的性能,

map(lambda x: d.remove(x) if x[1] = col_number, d.keys()) 

(3) 您還可以使用過濾器來做到這一點。

sum(
map(lambda x:x[1], filter(lambda x,y: x[1] == row_num and y > 0, d.items())) 
) 
+0

將映射或過濾器與lambda表達式相結合比較困難,與生成器表達式相比較:'sum(y for x,y in d.items ()if x [1] == row_num and y> 0)'(它應該等價於你的代碼,但你的代碼似乎有一個bug)。 – 2010-01-20 03:06:10

0

不,它不是可以用除整數之外的任何東西索引列表的情況。然而,字典是另一種情況。字典是由鍵值對組成的哈希表。密鑰必須是唯一且不可變的。該值可以是任何類型的對象,包括整數,元組,列表或其他字典。對於你的例子,元組可以作爲關鍵字,因爲它們是不可變的。另一方面,列表不是字典鍵,因此也不是字典鍵。

您詢問的一些功能可以作爲詞典和列表解析的組合來實現。其他人則需要繼承字典的子類並添加實現所需功能的方法。

2

這裏有一個如何輕鬆創建numpy的數組(矩陣)的例子:

>>> import numpy 
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]]) 

這裏是它是如何顯示

>>> a 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

,以及如何獲得的行或列:

>>> a[0,:] 
array([1, 2, 3]) 
>>> a[:,0] 
array([1, 4, 7]) 

希望這個例子的語法很清楚! Numpy相當強大。

1

您可以擴展列表功能以允許通過重載內置列表的__getitem__和__setitem__方法對元組進行索引。試試下面的代碼:

class my_list(list): 
    def __getitem__(self, key): 
     if isinstance(key, tuple) and len(key) > 0: 
      temp = [] 
      for k in key: temp.append(list.__getitem__(self, k)) 
      return temp 
     else: 
      return list.__getitem__(self, key) 

    def __setitem__(self, key, data): 
     if isinstance(key, tuple) and len(key) > 0: 
      for k in key: list.__setitem__(self, k, data) 
     else: 
      list.__setitem__(self, key, data) 


if __name__ == '__main__': 
    L = my_list([1, 2, 3, 4, 5]) 
    T = (1,3) 
    print(L[T])