是否有类似于 matlab 的 python 语法用于选择行和列?



>如果我有几个(浮点数(的列表,例如

list = [
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
]

如何在不使用循环的情况下获得第三列?如果它是 matlab 中的矩阵,我会做list(:,3).

你当然可以使用Numpy来帮助你实现这一目标。

import numpy as np
list = np.array([
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
])
list[:,2]

我认为在不使用任何循环的情况下,您无法使用本机 python 列表来实现这一点。

使用 zip 将列转置为行,然后选择第三个子列表(行(

lst = [
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
]

第三列:

list(zip(*lst))[2] 

使用库numpy

import numpy as np

list = [
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
]
np_list = np.array(list)
third_col = np_list[:,2] # counting starts from 0

Numpy 是一个非常好的解决方案:

import numpy as np

list = [
[111, 111, 4523.123, 111, 111],
[111, 111, 4526.15354, 111, 111],
[111, 111, 4580.112, 111, 111],
]
np_list = np.array(list)[:,2]

对于更复杂的数据操作,我建议使用pandas.DataFrame(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html(

如果必须使用列表,可以尝试列表理解。从技术上讲,这是一个循环,但使用更短的语法,并且是一种非常pythonic的集合处理方式。它还使您无需使用外部库:

>>> list = [
...        [111, 111, 4523.123, 111, 111],
...        [111, 111, 4526.15354, 111, 111],
...        [111, 111, 4580.112, 111, 111],
...        ]
>>> l = [ x[2] for x in list ]
>>> l
[4523.123, 4526.15354, 4580.112]

没有,但你可以创建一个处理它的类。基本上你需要覆盖类的__getitem__方法,检查传递的值是否是元组,在这种情况下相应地返回:

class MatlabList(list):
def __init__(self, *args):
if len(args) > 1:
return super().__init__(args)
return super().__init__(*args)
def __getitem__(self, item):
if isinstance(item, tuple):
# Remove the non-needed tuple in case it onle has one element
if len(item) == 1:
return self[item[0]]
if isinstance(item[0], slice):
return MatlabList(map(lambda x: x[item[1:]], self[item[0]]))
return self[item[0]][item[1:]]
return super().__getitem__(item)
lst = MatlabList(
MatlabList(111, 111, 4523.123, 111, 111),
MatlabList(111, 111, 4526.15354, 111, 111),
MatlabList(111, 111, 4580.112, 111, 111),
)
lst[1,2]  # cell at 2nd row, 3rd column
lst[1,:]  # 2nd row
lst[:,2]  # 3rd column

最新更新