2010-01-20 84 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])