用元组索引的Python列表

3 投票
8 回答
3908 浏览
提问于 2025-04-15 18:14

我在用Matlab,但现在需要用Python做一些事情。如果有人能帮我解答一下Python的语法问题,我会非常感激:

(1) 在Python中,列表可以用元组来索引吗?如果可以的话,我该怎么做呢?比如,我想用这个方法来表示一个数据矩阵。

(2) 假设我可以用元组来索引列表,比如说data[(row,col)],那么我该怎么删除整列呢?我知道在Matlab中,我可以这样做:

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

如果我想从data中删除第x列。

(3) 我怎么能轻松地计算每一行中非负元素的数量?比如,在Matlab中,我可以这样做:

 sum(data>=0,1)

这样可以给我一个列向量,表示每一行中非负元素的数量。

非常感谢!

8 个回答

3
  1. 不行,但字典可以。
  2. 听起来你想要的是一个“二维数组”,类似矩阵的东西,或者其他什么。你有没有看过numpy这个库?
  3. 这要看你在第二点选择了什么,不过Python确实有sum和其他一些可以直接作用于可迭代对象的函数。可以看看生成器表达式和列表推导式。例如:
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
8

你应该了解一下 numpy,它就是为这种情况而设计的。

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)

要小心:第二个例子展示了使用 Numpy/Scipy 时常见的一个陷阱。正如第三个例子所示,axis 属性通常设置为 0 是为了在数组的第一维上操作,设置为 1 是为了在第二维上操作,依此类推。但是像 delete 这样的命令实际上会反转维度的顺序,就像第二个例子所示的那样。你知道的,行优先和列优先。

撰写回答