MemoryError для построчных внешних продуктов в Numpy - PullRequest
0 голосов
/ 30 октября 2018

У меня есть две матрицы. Я делаю построчную внешнюю продукцию между ними. Моей первоначальной целью было повысить быстродействие. У меня есть рабочий код на образцах, но когда я хочу сделать их с (+2000, +2000) матрицами форм, я получаю MemoryError.

Я пытался преобразовать их в разреженные, но это невозможно для 3D или с einsum (см., Например, этот комментарий ).

Есть ли способ решить эту проблему?

Вот примерные матрицы:

A
Out[10]: 
array([[1, 1, 1, 1],
       [0, 0, 1, 1],
       [1, 1, 0, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1]])

B
Out[11]: 
array([[0.25, 0.  , 0.5 , 1.  , 0.  , 0.  , 0.  ],
       [0.25, 0.  , 0.5 , 0.  , 1.  , 0.  , 0.  ],
       [0.25, 0.5 , 0.  , 0.  , 0.  , 1.  , 0.  ],
       [0.25, 0.5 , 0.  , 0.  , 0.  , 0.  , 1.  ]])

А вот пример выполнения продукта:

A[:, :, None] * B.T[:, None, :]
Out[12]: 
array([[[0.25, 0.25, 0.25, 0.25],
        [0.25, 0.25, 0.25, 0.25],
        [0.25, 0.25, 0.25, 0.25],
        [0.25, 0.25, 0.25, 0.25]],

       [[0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.5 , 0.5 ],
        [0.  , 0.  , 0.5 , 0.5 ]],

       [[0.5 , 0.5 , 0.  , 0.  ],
        [0.5 , 0.5 , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ]],

       [[1.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ]],

       [[0.  , 0.  , 0.  , 0.  ],
        [0.  , 1.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ]],

       [[0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 1.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ]],

       [[0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 0.  ],
        [0.  , 0.  , 0.  , 1.  ]]])

Я также пытался сделать продукт следующими способами, с тем же результатом:

np.einsum('ij, ik -> ikj', A, B.T)

и

np.matmul(A[:, :, None], B.T[:, None, :])
...