3

我是 Matlab 用户,需要在某些事情上使用 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)

这会给我一个列向量,表示每行中非负条目的数量。

非常感谢!

4

8 回答 8

8

您应该查看numpy,它就是为这种事情而设计的。

于 2010-01-20T02:34:32.537 回答
3
  1. 不,但dicts可以。
  2. 听起来你想要一个“二维数组”、矩阵类型或其他东西。你看过numpy了吗?
  3. 取决于您从 #2 中选择的内容,但 Python 确实具有sum和其他可直接在可迭代对象上工作的函数。查看 gen-exprs(生成器表达式)和列表推导。例如:
row_count_of_non_neg = sum(1 for n in row if n >= 0)
# 或者:
row_count_of_non_neg = sum(n >= 0 for n in row)
# “滥用” True == 1 和 False == 0
于 2010-01-20T02:34:48.493 回答
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 相当强大。

于 2010-01-20T02:57:19.363 回答
2

我同意大家的看法。使用 Numpy/Scipy。但这里是您问题的具体答案。

  1. 是的。并且索引可以是内置列表或 Numpy 数组。假设x = scipy.array([10, 11, 12, 13])y = scipy.array([0, 2])。然后x[[0, 2]]两者x[y]都返回相同的东西。

  2. new_data = scipy.delete(data, x, axis=0)

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

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

于 2010-01-20T05:41:58.627 回答
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]) 
于 2017-08-11T17:48:03.930 回答
0

(1) 我不认为你可以使用元组作为 python 列表的索引。您可以使用列表列表(例如 a[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()))
)
于 2010-01-20T02:41:42.020 回答
0

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

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

于 2010-01-20T02:46:19.810 回答
0

使用本机 python,您可以使用:

my_list = [0, 1, 2, 3]
index_tuple = (1,2)
x = [item for idx, item in enumerate(my_list) if idx in index_tuple]
于 2021-11-10T09:13:37.770 回答