假设我有一个包含 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/