Построить матрицу ограничений так, чтобы нечетные строки были нулевыми - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть два массива: A имеет форму (m,n) и B имеет форму (2*m,n). Кроме того, четные строки B являются строками A. Пусть a = numpy.reshape(A,(A.size,1)) и b = numpy.reshape(B,(B.size,1)). Моя цель состоит в том, чтобы построить диагональную матрицу R такую, что R*b = a. Массивы выглядят так:

[[13865.995  14020.785  14020.788 ]
 [ 6885.634   6784.8813  6837.428 ]
 [14510.425  14712.554  14657.217 ]
 [ 7688.0923  7817.8457  7792.413 ]
 [10473.903  10417.55   10469.508 ]
 [10485.661  10348.152  10632.414 ]]
[[14662.705  14869.951  15166.294 ]
 [13865.995  14020.785  14020.788 ]
 [ 9780.559  10038.395  10202.31  ]
 [ 6885.634   6784.8813  6837.428 ]
 [ 7167.9575  7357.9062  7287.3003]
 [14510.425  14712.554  14657.217 ]
 [12825.017  12680.751  12823.563 ]
 [ 7688.0923  7817.8457  7792.413 ]
 [ 6861.9443  6826.6245  6758.8965]
 [10473.903  10417.55   10469.508 ]
 [ 8498.976   8637.245   8718.052 ]
 [10485.661  10348.152  10632.414 ]]

Я уверен, что могу построить массив x со значениями 0 и 1 с правильными индексами, а затем установить R = np.diag(x), но я не уверен, как я могу сделать эту работу и если это лучшее решение. Любая помощь приветствуется

1 Ответ

1 голос
/ 17 февраля 2020

Требуется немного творческой индексации массивов, но, надеюсь, это то, что вам нужно. Примечание: в данном случае R не является диагональной матрицей.

import numpy

A = numpy.array([[13865.995,  14020.785,  14020.788 ],
    [ 6885.634,   6784.8813,  6837.428 ],
    [14510.425,  14712.554,  14657.217 ],
    [ 7688.0923,  7817.8457,  7792.413 ],
    [10473.903,  10417.55,   10469.508 ],
    [10485.661,  10348.152,  10632.414 ]])
B = numpy.array([[14662.705,  14869.951,  15166.294 ],
    [13865.995,  14020.785,  14020.788 ],
    [ 9780.559,  10038.395,  10202.31  ],
    [ 6885.634,   6784.8813,  6837.428 ],
    [ 7167.9575,  7357.9062,  7287.3003],
    [14510.425,  14712.554,  14657.217 ],
    [12825.017,  12680.751,  12823.563 ],
    [ 7688.0923,  7817.8457,  7792.413 ],
    [ 6861.9443,  6826.6245,  6758.8965],
    [10473.903,  10417.55,   10469.508 ],
    [ 8498.976,   8637.245,   8718.052 ],
    [10485.661,  10348.152,  10632.414 ]])
a = numpy.reshape(A,(A.size,1))
b = numpy.reshape(B,(B.size,1))
R = numpy.zeros((A.size,B.size))
R[[a for a in range(A.size)],[a for a in range(B.size) if (a // 3) % 2]] = 1
print( numpy.all(numpy.dot(R, b) == a) )
# True
...