重新排列numpy数组中的子阵列?

时间:2014-05-04 08:10:05

标签: python arrays numpy

我有一个有形状的numpy数组(6023,6023)。实际上它是一些"子阵列的组合",这意味着我可以将一个名称归属于数组每一侧的几个部分,并且子阵列显示这些"名称的相互作用" ;。两侧的名称相同(数据是围​​绕它的主要对角线的数字)。 这就是数组实际包含的内容。这些是我称之为子阵列及其各自名称的部分边界的坐标:

boundaris = [(0, 68), (68, 1190), (1190, 2248), (2248, 3399), (3399, 4795), (4795, 6023)]
names = ('4', 'X', '2R', '2L', '3R', '3L')

因此,在角落里有一个数据正方形,与#4;'和' 4'。它接近' - ' X',' X' - ' 4'和' X' - ' X'。等等。如果不清楚的话,我可以拍一张可能会澄清我的意思的照片。

所以问题是:如何重新排列子阵列,以便名称以不同的顺序排列?我希望它们按以下顺序排列: (' 2L',' 2R',' 3L',' 3R',' 4',' X&#39)

更新1

在发布图片之前,我会尝试以不同的方式解释它。这种情况基本上等同于:我有6 * 6 = 36个阵列,它们对应于互动:' 2L' - ' 2L',' 2L' - & #39; 2R',' 2L' - ' 3L',...,' X' - ' X'。如何使用所有这些数组创建一个数组,以便它们在逻辑上保持一致并按名称顺序排列(' 2L',' 2R',' 3L&# 39;,' 3R',' 4',' X')在最终阵列的每一侧?

更新2

我已经制定了我需要的方案,希望它能清除它。

这就是我在开始时所拥有的: enter image description here

大方块内的小矩形代表'子阵列'。它们中的每一个都包含许多单元格,例如,' 4' 4' 4' (最小的一个)包含68 ^ 2 = 4624个细胞。整个数组包含6023 ^ 2 = 36276529'单元格。

然后我想重新排列子数组,以便名称以不同的顺序排列: enter image description here

这是它应该如何看待转型。我碰巧知道名称边界的最终坐标,但它们并不难计算。希望你可以看到我想要做的事情:重新排列大数组的部分(基本上是较小的数组),这样它们就形成了一个具有不同位置的数组的数组'沿着它的轴。

1 个答案:

答案 0 :(得分:1)

这将重新排列输入数组的名称和块 - 块重新排列中的关键是numpy.ix_函数,它允许类似Matlab的索引。

boundaris = [(0, 68), (68, 1190), (1190, 2248), (2248, 3399), (3399, 4795), (4795, 6023)]
names = ('4', 'X', '2R', '2L', '3R', '3L')
A = numpy.random.random((6023, 6023))

neworder = [3, 2, 5, 4, 0, 1]

def rearrange(l):
    return [l[i] for i in neworder]

newnames = rearrange(names)
ranges = numpy.concatenate([numpy.arange(l, u) for l, u in rearrange(boundaris)])
newA = A[numpy.ix_(ranges, ranges)]