问题在于如何将矩阵拆分为块。
如果我有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]
但是a
,b
,c
... 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_list
和2
列。我可以使用np.reshape()
实现我想要的吗?
答案 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)