Criar uma matriz de produtos externos em numpy

Eu tenho uma matriz de n vetores de comprimento m. Por exemplo, comn = 3, m = 2:

x = array([[1, 2], [3, 4], [5,6]])

Eu quero pegar o produto externo de cada vetor consigo mesmo, depois concatená-los em uma matriz de matrizes quadradas de forma(n, m, m). Então, para ox acima eu iria ficar

array([[[ 1,  2],
        [ 2,  4]],

       [[ 9, 12],
        [12, 16]],

       [[25, 30],
        [30, 36]]])

Eu posso fazer isso com umfor loop como assim

np.concatenate([np.outer(v, v) for v in x]).reshape(3, 2, 2)

Existe uma expressão numpy que faz isso sem o Pythonfor loop?

Pergunta bônus: como os produtos externos são simétricos, não precisom x m operações de multiplicação para calculá-las. Posso obter essa otimização de simetria de numpy?

questionAnswers(2)

yourAnswerToTheQuestion