Алгоритм в Python, эквивалентный Q, чтобы вручную генерировать единичную матрицу - PullRequest
0 голосов
/ 07 сентября 2018

Я знаю о np.eye, который генерирует единичную матрицу. Этот вопрос касается алгоритма, а не окончательного результата.

В Q (kdb + language) я могу сгенерировать единичную матрицу, используя следующий код:

`float${x =\: x} til 12000

Экстремальный эквивалент Python более или менее таков:

import numpy as np
r=np.arange(12000)
np.asarray([i==r for i in r]).astype(float)

С подходом Python при np.asarray копирование ненужных данных для преобразования массива Python обратно в массив Numpy. Есть ли способ избежать этого копирования? То есть Я хочу выполнить [i==r for i in r], не выходя из домена numpy.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Если ваша цель состоит в том, чтобы сгенерировать единичную матрицу наиболее эффективным способом, я бы порекомендовал следующий прием:

>>> n = 5
>>> e = np.zeros(n*n)
>>> e[::n+1] = 1
>>> e.reshape((n, n))
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])
0 голосов
/ 07 сентября 2018
In [822]: r=np.arange(4)

Ваше понимание списка:

In [823]: [i==r for i in r]
Out[823]: 
[array([ True, False, False, False]),
 array([False,  True, False, False]),
 array([False, False,  True, False]),
 array([False, False, False,  True])]

Эквивалент транслируемого массива:

In [824]: r[:,None]==r[None,:]
Out[824]: 
array([[ True, False, False, False],
       [False,  True, False, False],
       [False, False,  True, False],
       [False, False, False,  True]])

другой подход к массиву:

In [825]: A = np.zeros((4,4),int)
In [826]: A[np.arange(4),np.arange(4)] = 1
In [827]: A
Out[827]: 
array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1]])

или (по коду np.tri):

In [831]: np.equal.outer(np.arange(4), np.arange(4))
Out[831]: 
array([[ True, False, False, False],
       [False,  True, False, False],
       [False, False,  True, False],
       [False, False, False,  True]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...