查找改组的列索引

橙子

我有一个奇怪的问题,即将2个numpy矩阵(2d数组)关联到另一个。我认为这个问题是作为具有两个矩阵最好地描述AB针对B的轴线= 1的索引已被混洗(的值AB沿列轴(= 1)的位置正好有所不同)。我要查找的是索引映射mA[:,m] == B因此我知道其中的哪一列B与中的哪一列有关A

这是一个示例(鉴于ab,我想找到m):

>>> import numpy as np
>>> a = np.random.rand(70, 300)
# we set up `m` to demonstrate the issue, but in fact that's not given
>>> m = np.asarray(list(range(300)))
>>> m
array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
        13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,
        26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
        39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
        52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
        65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
        78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
     ...
>>> np.random.shuffle(m)
>>> m
array([209, 198,  17, 150, 181, 169,  47,  29, 109, 137, 149,   8,  85,
       251, 254, 191, 133,  40, 106, 243, 202, 101, 269,  23, 248,  49,
         3, 160,  88, 192, 166, 105, 283, 171, 128, 211, 206, 235, 185,
        37, 250,  66, 272, 259, 260,  14,  50, 256,  10, 238, 177,  15,
        51, 293,  53, 197,  11, 296, 111, 167,  86, 155, 215, 234,  80,
        76,  42, 216, 104, 144,  90,  45,  70, 126,  30, 117,   6, 139,
       299, 232, 182,  95, 129, 217,  55, 279, 118, 189, 180, 285, 157,
        79, 159, 294,  68, 244,  91,  52,  56, 127, 187, 131, 292, 164,
       132,  38,  87, 265, 173, 123, 154,  26, 143, 223, 276, 257, 263,
        93, 261, 179, 186, 267,  59, 221,  44,  31,  21,   9, 194,  25,
     ...
>>> b = a[:, m] # initialise `b`
>>> (a == b).all()
False
>>> (b == a[:, m]).all()
True

另一个错综复杂的事实是,矩阵实际上有点稀疏,这意味着可能存在许多可能的m版本(但我并不期望太多,因为行数相对较大,应该限制歧义的数量)。

Yohai Magan |

我认为没有做到这一点的纯粹方法。A的第一个维度上的简单for循环可以检索m。

import numpy as np
shape = (5, 5)
A = np.random.rand(*shape)
# we set up `m` to demonstrate the issue, but in fact that's not given
m = np.asarray(list(range(shape[1])))
np.random.shuffle(m)
B = A[:, m]

对于B中的每个列i,我们可以找到A中的第j列,通过注意B [:, i]-A [:, j] = 0进行匹配,因此对于上面描述的简单情况,我们可以这样做:

m = []
for b in B[0]:
    m.append((np.argmin(np.abs(A[0] - b)))) 

对于稀疏矩阵,如果存在一些i和j st A [:, i] = A [:, j],则m不是唯一的,但我们可以通过简单的方法获得m

m = []
for i in range(B.shape[1]):
    m.append((np.argmin(np.linalg.norm(A - np.tile(B[:, i].reshape(-1, 1), shape[1]), axis=0))))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章