元组索引的Python列表

元组索引的Python列表,python,list,matlab,list-comprehension,Python,List,Matlab,List Comprehension,我是一名Matlab用户,需要在某些方面使用Python,如果有人能帮助我使用Python语法,我将不胜感激: (1) 在Python中,列表可以通过元组进行索引,这是真的吗?如果是,我该怎么做?例如,我想用它来表示一个数据矩阵 (2) 假设我可以使用元组索引的列表,比如数据[(行,列)],如何删除整个列?我知道在Matlab中,我可以做如下事情 new_data = [data(:,1:x-1) data(:,x+1:end)]; 如果我想从数据中删除x列 (3) 如何轻松计算每行中非负元

我是一名Matlab用户,需要在某些方面使用Python,如果有人能帮助我使用Python语法,我将不胜感激:

(1) 在Python中,列表可以通过元组进行索引,这是真的吗?如果是,我该怎么做?例如,我想用它来表示一个数据矩阵

(2) 假设我可以使用元组索引的列表,比如数据[(行,列)],如何删除整个列?我知道在Matlab中,我可以做如下事情

 new_data = [data(:,1:x-1) data(:,x+1:end)];
如果我想从数据中删除x列

(3) 如何轻松计算每行中非负元素的数量。例如,在Matlab中,我可以这样做:

 sum(data>=0,1)
这将给我一个列向量,它表示每行中非负条目的数量

非常感谢

你应该调查一下,它就是为这类事情而设计的

  • 不,但是dicts可以
  • 听起来你想要一个“2d数组”,矩阵类型,或者其他什么。你看过了吗
  • 取决于您从#2中选择什么,但Python确实具有直接在iterables上工作的函数和其他函数。查看genexprs(生成器表达式)和列表理解。例如:
  • 非负的行计数=和(如果n>=0,则行中n为1) #或: 非负的行计数=和(n>=0表示行中的n) #“滥用”真==1和假==0 (一) 我认为不能使用元组作为python列表的索引。您可以使用列表列表(例如a[i][j]),但这似乎不是您的重点。可以使用键为tuple的字典

    d = { (1,1):1, (2,1):2  ... } 
    
    (二) 如果你不介意表演的话

    map( lambda x: d.remove(x) if x[1] = col_number, d.keys() )
    
    (三) 您也可以使用过滤器来实现这一点

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

    不,列表不能用整数以外的任何东西编制索引。然而,字典是另一种情况。字典是由键值对组成的哈希表。密钥必须是唯一且不可变的。该值可以是任何类型的对象,包括整数、元组、列表或其他字典。例如,元组可以用作键,因为它们是不可变的。另一方面,列表不是,因此不能是字典键


    您所问的一些功能可以作为字典和列表理解的组合来实现。其他人则需要对字典进行子类化并添加方法来实现所需的功能。

    下面是一个如何在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相当强大。

    我同意大家的看法。使用Numpy/Scipy。但以下是对你的问题的具体回答

  • 对。索引可以是内置列表,也可以是Numpy数组。假设
    x=scipy.array([10,11,12,13])
    y=scipy.array([0,2])
    。然后
    x[[0,2]]
    x[y]
    都返回相同的内容

  • new\u data=scipy.delete(数据,x,轴=0)

  • (数据>=0)。总和(轴=1)


  • 小心:示例2说明了Numpy/Scipy的一个常见陷阱。如例3所示,
    axis
    属性通常设置为0以沿数组的第一维操作,1以沿第二维操作,依此类推。但是一些命令,如
    delete
    实际上颠倒了维度的顺序,如示例2所示。您知道,行主项与列主项。

    您可以通过重载内置列表的u getitem和u 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]) 
    

    numpy将使用与matlab几乎完全相同的语法来处理问题中的所有问题。numpy数组是一个不错的选择。我建议使用此页面来帮助简化转换—我不知道它是否有助于找到等效的Python操作,但是从矩阵中删除整个列也可以使用语法
    data(:,x)=[]谢谢大家!NumPy/SciPy正是我所需要的。语法非常接近Matlab。再次感谢你的帮助,我真的很感激!!!这不是很棒吗?如果您是Matlab用户,那么您会发现ipython与Numpy/Scipy一起绝对不可或缺。在我看来,面向对象,例如(data>=0).sum()或data.size或data.shape(),使得Numpy/Scipy甚至比Matlab更好。将map或filter与lambdas相结合,与生成器表达式相比是很尴尬的:
    sum(y代表x,y代表d.items(),如果x[1]==row_num和y>0)
    (应该与您的代码等效,但您的代码似乎有bug)。
    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])