python - 列表列表的子矩阵(没有 numpy)

标签 python matrix python-3.x

假设我有一个由如下列表组成的矩阵:

>>> LoL=[list(range(10)) for i in range(10)]
>>> LoL
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

另外,假设我有一个名为 LoLa 的相同结构的 numpy 矩阵:

>>> LoLa=np.array(LoL)

使用 numpy,我可以像这样得到这个矩阵的子矩阵:

>>> LoLa[1:4,2:5]
array([[2, 3, 4],
       [2, 3, 4],
       [2, 3, 4]])

我可以像这样在纯 Python 中复制 numpy 矩阵切片:

>>> r=(1,4)
>>> s=(2,5)
>>> [LoL[i][s[0]:s[1]] for i in range(len(LoL))][r[0]:r[1]]
[[2, 3, 4], [2, 3, 4], [2, 3, 4]] 

这不是世界上最容易阅读的东西,也不是最有效率的:-)

问题:是否有更简单的方法(在纯 Python 中)将任意矩阵切片为子矩阵?

最佳答案

In [74]: [row[2:5] for row in LoL[1:4]]
Out[74]: [[2, 3, 4], [2, 3, 4], [2, 3, 4]]

您还可以通过定义 list 的子类来模仿 NumPy 的语法:

class LoL(list):
    def __init__(self, *args):
        list.__init__(self, *args)
    def __getitem__(self, item):
        try:
            return list.__getitem__(self, item)
        except TypeError:
            rows, cols = item
            return [row[cols] for row in self[rows]]

lol = LoL([list(range(10)) for i in range(10)])
print(lol[1:4, 2:5])

也产生

[[2, 3, 4], [2, 3, 4], [2, 3, 4]]

使用 LoL 子类不会赢得任何速度测试:

In [85]: %timeit [row[2:5] for row in x[1:4]]
1000000 loops, best of 3: 538 ns per loop
In [82]: %timeit lol[1:4, 2:5]
100000 loops, best of 3: 3.07 us per loop

但速度不是一切——有时可读性更重要。

关于python - 列表列表的子矩阵(没有 numpy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15650538/

相关文章:

python - 在python中合并n个排序的元组列表

python - 查找每列中出现次数最多的元素的最简单方法

r - data.table 上的数学运算(在 R 中)

java - 矩阵表达式解析器/引擎

python - Pandas 数据框按总和同时忽略非数值

python - TemplateDoesNotExist 但它存在

python - 使用 python 进行时间格式到关键字替换

python - 获取所有链接并迭代列表(机器人框架)

python - 使用 GEKKO 进行快速傅立叶变换

r - 如何在 R 中的对称矩阵(12k X 12k)中找到前 10,000 个元素的索引