如何重新排列numpy数组中的子数组?

1 投票
1 回答
765 浏览
提问于 2025-04-18 05:18

我有一个形状为(6023, 6023)的numpy数组。实际上,它是几个“子数组”的组合,这意味着我可以给数组的某些部分命名,这些子数组展示了这些“名字”之间的相互作用。名字在两边是相同的(而且数据在主对角线周围是对称的)。

这个数组的实际内容就是这样。以下是我称之为子数组的部分的边界坐标和它们各自的名字:

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

所以在最角落有一个数据方块,表示'4'和'4'之间的相互作用。它靠近'4'-'X'、'X'-'4'和'X'-'X',依此类推。如果这些都不太清楚,我可以画张图,可能会更清楚我想表达的意思。

所以我的问题是:我该如何重新排列这些子数组,让名字的顺序变得不同?我希望它们的顺序是:('2L', '2R', '3L', '3R', '4', 'X')

更新 1

在我发图之前,我会尝试用不同的方式解释。这个情况本质上等同于:我有36个数组(6*6=36),它们对应的相互作用是:'2L'-'2L'、'2L'-'2R'、'2L'-'3L',等等。我该如何制作一个包含所有这些数组的数组,使它们在最终数组的两侧逻辑一致,并且按照名字的顺序('2L', '2R', '3L', '3R', '4', 'X')排列?

更新 2

我做了一个我需要的方案,希望能让事情更清楚。

这是我开始时的样子:

enter image description here

大方块里的小矩形代表“子数组”。每个子数组里包含很多“单元格”,例如,'4'-'4'(最小的那个)包含68^2=4624个单元格。整个数组包含6023^2=36276529个“单元格”。

然后我想重新排列这些子数组,让名字的顺序变得不同:

enter image description here

这就是变换后应该的样子。我知道名字的边界的最终坐标,但计算起来并不困难。希望你能明白我想做的事情:重新排列一个大数组的部分(实际上是较小的数组),使它们在轴上形成一个名字位置不同的数组。

1 个回答

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)]

撰写回答