Я хочу получить минимальный номер индекса для строки, исключая нули - PullRequest
1 голос
/ 21 октября 2019

Рассмотрим следующий код, который генерирует следующую dst матрицу.

tmp = pd.DataFrame()
tmp['a'] = np.random.randint(1, 10, 5)
tmp['b'] = np.random.randint(1, 10, 5)
dst = pairwise_distances(tmp, tmp, metric='l2')
dst

, которая выглядит следующим образом

array([[0. , 5.38516481, 5. , 4.12310563, 2. ],
[5.38516481, 0. , 1.41421356, 3.16227766, 5. ],
[5. , 1.41421356, 0. , 4. , 4.12310563],
[4.12310563, 3.16227766, 4. , 0. , 5. ],
[2. , 5. , 4.12310563, 5. , 0. ]])

Теперь я хочу как-то получить 4 в качестве выходного столбца, потому что для row=0 and col=4 лежит минимальное расстояние row0 до другой строкиотдельно от себя. Я пытаюсь использовать следующий код, чтобы сделать работу! но np.nonzeros() портит игру. np.argmin(dst[0, np.nonzero(dst[0,:])]) Я получаю 3 как вывод, где я должен получить 4. Я понимаю, что np.nonzero() возвращает другой набор измерений [1,2,3,4], из которых argmin выбирает столбец 3rd, который является действительным столбцом 4th матрицы dst. Нужна помощь! Заранее спасибо !!

1 Ответ

1 голос
/ 21 октября 2019

Вместо argmin используйте np.min и сравните результат с dst[0,:]. Наконец, передайте его np.flatnonzero или np.nonzero

np.flatnonzero(np.min(dst[0,np.nonzero(dst[0,:])]) == dst[0,:])

Out[150]: array([4], dtype=int64)

или

np.nonzero(np.min(dst[0,np.nonzero(dst[0,:])]) == dst[0,:])[0]

Out[151]: array([4], dtype=int64)

Если вы хотите вернуть целочисленный индекс, вы можете использовать np.argmax впоследний шаг

np.argmax(np.min(dst[0,np.nonzero(dst[0,:])]) == dst[0,:])

Out[157]: 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...