python - 重新排列 numpy 数组中的子数组?

标签 python arrays numpy

我有一个形状为 (6023, 6023) 的 numpy 数组。实际上,它是一些“子数组”的组合,这意味着我可以为数组每一侧的几个部分指定一个名称,并且子数组显示这些“名称”的相互作用。两侧的名称相同(并且数据在主对角线周围是对称的)。 这就是数组的实际组成。这些是我称之为子数组的部分的边界坐标及其各自的名称:

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

所以在最角落有一个数据方 block ,其中有“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

这就是转换后的样子。我碰巧知道名称边界的最终坐标,但它们并不难计算。希望您能看到我想要做的事情:重新排列大数组的各个部分(本质上是较小的数组),以便它们形成一个沿其轴具有不同位置“名称”的数组。

最佳答案

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

关于python - 重新排列 numpy 数组中的子数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23454008/

相关文章:

python - 使用 xlsxwriter 打印 pandas 输出时,某些单元格为空

python - Fabric - sudo -u

python - 转换为 int64 时,DataFrame 中的混合时间戳会导致错误

数组数组中的 Ruby group_by

python - 按索引对 numpy.array 行进行排序

python - 如何从n维集合轻松创建n-1维集合?

Python如何将日期作为单词返回?

c - 段错误 : 11 while copying one array to another

php - 我应该取消设置我的 PHP 数组值吗?

python - 一维 numpy 数组和 scipy 稀疏矩阵之间的点积