表示用于逐列操作的2维矩阵

时间:2014-04-27 18:02:30

标签: python list

我创建了一个表示2-dim矩阵的列表:

mylist = []
while (some condition):
    x1 = ...
    x2 = ...
    mylist.append([x1,x2])

我想测试矩阵第二列中的每个条目是否大于0.45,但我遇到了一些困难:

>>> mylist
[[1, 2], [1, -3], [-1, -2], [-1, 2], [0, 0], [0, 1], [0, -1]]
>>> mylist[][1] > 0.4
  File "<stdin>", line 1
    mylist[][1] > 0.4
           ^
SyntaxError: invalid syntax
>>> mylist[:,1] > 0.4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple

鉴于mylist是一个子列表列表,我如何指定其所有子列表的所有第二个组件?

选择列表来表示2维矩阵是否合适?我之所以选择它,只是因为矩阵的大小是动态确定的。你会推荐什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

像这样使用all()

>>> lst = [[1, 2], [1, -3], [-1, -2], [-1, 2], [0, 0], [0, 1], [0, -1]]
>>> all(x > 0.45 for _, x in lst)
False

如果您需要布尔列表,请使用列表解析:

>>> [x > 0.45 for _, x in lst]
[True, False, False, True, False, True, False]

mylist[][1]语法无效,但如果您可以使用NumPy,那么您可以执行以下操作:

In [1]: arr = np.array([[1, 2], [1, -3], [-1, -2], [-1, 2], [0, 0], [0, 1], [0, -1]])

In [2]: all(arr[:,1] > 0.45)
Out[2]: False

In [4]: arr[:,1] > .45
Out[4]: array([ True, False, False,  True, False,  True, False], dtype=bool)

答案 1 :(得分:2)

如果继续使用列表,@ Aशwiniचhaudhary的解决方案非常棒。

我建议您使用numpy,因为它可以通过矢量化函数提供显着的速度提升,尤其是在处理较大的数据集时。

import numpy as np

mylist = [[1, 2], [1, -3], [-1, -2], [-1, 2], [0, 0], [0, 1], [0, -1]]

myarray = np.array(mylist)

# Look at all "rows" (chosen by :) and the 2nd "column" (given by 1).
print(myarray[:,1]>0.45)
# [ True False False  True False  True False]