从列表中提取二维数组的 Pythonic 方法

标签 python list numpy

假设我有一个包含 16 个元素的列表:

lst=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P']

此列表表示一个 4 x 4 数组,其中所有元素都已放入一维列表中。在其数组形式中,它具有以下形式:

'A', 'B', 'C', 'D'
'E', 'F', 'G', 'H'
'I', 'J', 'K', 'L'
'M', 'N', 'O', 'P' 

我想从这个一维列表中提取一个子矩阵作为另一个始终从第一个元素开始的一维列表。

例如从 lst 中提取一个 2 x 2 矩阵:

'A', 'B', 'E', 'F'

或者从 lst 中提取一个 3 x 3 矩阵:

'A', 'B', 'C', 'E', 'F', 'G', 'I', 'J', 'K'

为了实现这一点,我使用 numpy 将列表调整为数组,提取子矩阵,然后再次展平:

import numpy as np

# The size of the matrix represented by lst
init_mat = 4
# Desired matrix size to extract
mat_size = 2
A = np.resize(lst,(init_mat,init_mat))
B = A[0:mat_size, 0:mat_size].flatten()
C = map(str,B)

这行得通,但我想知道是否有更 pythonic 的方法来做到这一点,因为我认为这种方法不能很好地适应矩阵大小。

最佳答案

调用 flatten() 然后调用 map() 的效率低于:

B = A[:mat_size, :mat_size].reshape(-1)
C = B.tolist()

这避免了一些复制和不必要的函数调用。

有关 reshape()flatten() 的更多信息,请参阅:What is the difference between flatten and ravel functions in numpy?

您也可以完全不使用 NumPy。在某种程度上,这更简单。您需要使用特定的输入数据进行测试,看看哪个更快。

[lst[i*init_mat + j] for i in range(mat_size) for j in range(mat_size)]

关于从列表中提取二维数组的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45522134/

相关文章:

python - 如何在 Python 中获取列表并填充值并放入数据框和过滤器中?

python - 按部分比较python中的两个numpy数组

python - 当目标是一个热编码时,随机森林预测任一类

android - 获取属于特定组的联系人列表

python - Flake8 使用系统 python 而不是 virtualenv

python - 显示基于元组的排序列表并在字典中循环

python-2.7 - AWS Lambda 和 Numpy 库 - 导入多数组 numpy 扩展模块失败

python - 测试两个 numpy 二维数组的相等性

Python修改一个xml文件

python - 类方法属性TypeError : 'property' object is not iterable