Вы можете написать запрос на объединение DQL, как показано ниже
$em = $this->getContainer()->get('doctrine')->getManager();
$repository = $em->getRepository('YourNamespaceYourBundle:User');
$query = $repository->createQueryBuilder('u')
->innerJoin('u.groups', 'g')
->where('g.id = :group_id')
->setParameter('group_id', 5)
->getQuery()->getResult();
. Ваше сопоставление для свойства groups
в объекте User
будет обрабатывать часть соединения, вам не нужно упоминать таблицу переходов в ваш DQL-запрос
Я бы использовал argsort()
:
top2_ind = score_matrix.argsort()[:,::-1][:,:2]
То есть создаст массив, содержащий индексы, которые будут сортировать score_matrix
:
array([[1, 2, 0],
[0, 1, 2],
[0, 1, 2]])
столбцы с ::-1
, затем возьмите первые два столбца с :2
:
array([[0, 2],
[2, 1],
[2, 1]])
Тогда аналогично, но с регулярным np.sort()
, чтобы получить значения:
top2_score = np.sort(score_matrix)[:,::-1][:,:2]
Который, следуя той же самой механике, что и выше, дает вам:
array([[ 1. , 0.4],
[ 0.8, 0.6],
[ 0.5, 0.3]])
Ниже приведен подход с использованием np.argpartition
-
idx = np.argpartition(a,range(M))[:,:-M-1:-1] # topM_ind
out = a[np.arange(a.shape[0])[:,None],idx] # topM_score
Прогон образца -
In [343]: a
Out[343]:
array([[ 1. , 0.3, 0.4],
[ 0.2, 0.6, 0.8],
[ 0.1, 0.3, 0.5]])
In [344]: M = 2
In [345]: idx = np.argpartition(a,range(M))[:,:-M-1:-1]
In [346]: idx
Out[346]:
array([[0, 2],
[2, 1],
[2, 1]])
In [347]: a[np.arange(a.shape[0])[:,None],idx]
Out[347]:
array([[ 1. , 0.4],
[ 0.8, 0.6],
[ 0.5, 0.3]])
Альтернативно, возможно, медленнее, но немного короче код для получения idx
будет с np.argsort
-
idx = a.argsort(1)[:,:-M-1:-1]
Вот post
, содержащий некоторый тест времени выполнения, который сравнивает np.argsort
и np.argpartition
с подобная проблема.