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

2024-10-02 14:16:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个形状为(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

在我发布图片之前,我会尝试用不同的方式解释。这种情况基本上是等价的:我有6*6=36个数组,它们对应于交互:“2L”—“2L”,“2L”-“2R”,“2L”-“3L”,…,“X”-“X”。我如何用所有这些数组组成一个数组,使它们在逻辑上是一致的,并且在最后一个数组的每一边按名称的顺序('2L'、'2R'、'3L'、'3R'、'4'、'X')?在

更新2

我已经为我需要的东西制定了一个计划,希望它能解决问题。在

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

大正方形内的小矩形代表“子阵列”。每一个都包含许多“单元格”,例如,“4”-“4”(最小的一个)包含68^2=4624个单元格。整个数组包含6023^2=36276529“单元格”。在

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

这就是它在转型后的样子。我碰巧知道名字边界的最终坐标,但它们并不难计算。希望你能看到我想要做的:重新排列一个大数组的部分(本质上是更小的数组),这样它们就形成了一个数组,在它的轴上有不同的“名称”位置。在


Tags: 数据numpy名称names方式图片数组名字
1条回答
网友
1楼 · 发布于 2024-10-02 14:16:02

这将重新排列输入数组的名称和块-块重新排列的关键是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)]

相关问题 更多 >

    热门问题