如何在Python中将嵌套元组的矩阵拆分为块?

时间:2019-11-05 03:18:39

标签: python matrix split

问题在于如何将矩阵拆分为块。

如果我有4x4矩阵,则如下所示。

[[a, b, c, d], [e, f, g, h], [h, i, j, k], [l, m, n, o]]

我想分成以下几块:

[a, b]  
[c, d]  

[h, i]  
[j, k]

[e, f]  
[g, h]  

[l, m]  
[n, o]

但是abc ... o是嵌套的元组,例如a = [(x1,y1),(x2,y2),...(xn,yn)]n不一定等于矩阵中的每个元素。

是否有任何内置函数可以做到这一点,或者我必须操纵索引并一一挑选元素?我尝试使用np.vsplit()np.hsplit(),但它们对我的数据无效。

更新: np.vsplit()np.hsplit()可能会解决我的问题,但还有一个问题。我得到的数据是16个坐标列表,但是这些列表的长度(每个列表中2d坐标的数量)不相等。为了使用np.vsplit()np.hsplit(),我必须将16个列表转换为numpy ndarray并对其进行整形。此ndarray的形状应类似于(4, 4, x, 2),这意味着它们被放置在4行,4列中,每个元素都有x=number_of_coordinates_in_that_list2列。我可以使用np.reshape()实现我想要的吗?

2 个答案:

答案 0 :(得分:0)

这就是你想要的吗?

[[i[:2],i[2:]] for i in a]

答案 1 :(得分:0)

我终于解决了我的问题,并想总结一下。 我的数据就像

[ 
    [(1.008,0.177),(1.035,0.511),...,(3.221,0.472)], 
    [(0.332,0.122),(1.023,0.115),...,(3.323,0.427)], 
    ...,
    [(0.212,0.141),(1.023,0.115),...,(3.892,0.918)],
]

我不知道如何用英语来描述这种数据,但是它本质上是一个列表,其元素是列表中的元组。它是一维的,但我想将此数据用作2D矩阵,并将其拆分为类似于我在问题中描述的块。

我只是在1D列表中找到每个块的索引并将其切片。

Data = [ [(), (), ...], [(), (), ...], ... ]
# Calculate block start index(Upper left).
rows = int(matrix_size / block_size)
columns = int(matrix_size / block_size)
index_0s = []
for row in range(rows):
    for column in range(columns):
        index_0s.append(row * matrix_size * block_size + column * block_size)

def generate_block(block_start_index):
    indices = []
    for i in range(block_size):
        for j in range(block_size):
            index_ij = matrix_size * i + block_start_index + j
            indices.append(index_ij)
    block = []
    for block_index in indices:
        block.append(Data[block_index])
    return block

# Generate all blocks.
blocks = []
for index_0 in index_0s:
    block_i = generate_block(index_0)
    blocks.append(block_i)