Estou procurando uma função capaz de receber uma m x n
matriz que repita cada linha n vezes em uma grade de identidade de tamanho m.
Para demonstração:
input = [[a1, b1, c1],
[a2, b2, c2]]
output = [[a1, b1, c1, 0, 0, 0],
[a1, b1, c1, 0, 0, 0],
[a1, b1, c1, 0, 0, 0],
[ 0, 0, 0, a2, b2, c2],
[ 0, 0, 0, a2, b2, c2],
[ 0, 0, 0, a2, b2, c2]]
Da última vez que perguntei algo semelhante, me falaram do produto Kronecker: existe alguma função semelhante?
Embora pareça semelhante, parece-me que o problema em questão não pode ser resolvido usando um produto de Kronecker: com este último, você só conseguiria obter repetições de sua matriz de entrada completa como blocos da matriz de resultado.Corrigindo-me: para uma solução que emprega o produto Kronecker, veja a resposta de @ThomasIsCoding .
Em qualquer caso, o que você precisa são as linhas individuais, repetidas, como blocos da matriz de resultados. Então é isso que o código abaixo faz: ele constrói uma matriz de blocos a partir das linhas, usando
scipy.linalg.block_diag()
, então as repete conforme necessário, usandonumpy.repeat()
. Note queblock_diag()
espera blocos individuais como argumentos individuais, e é por isso quea
é descompactado com o*
prefixo.Aqui está outra opção, usando
np.kron
o que dá