Как найти минимальные индексы и разорвать связи по наименее используемым индексам в Python? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть пустой массив, подобный следующему:

A = np.array([[1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 5, 1, 1, 1],
              [1, 1, 1, 1, 3, 3, 1, 1],
              [1, 1, 1, 1, 1, 1, 2, 1],
              [1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 1, 4, 1, 1]])

Я ищу минимальные индексы в каждом столбце. Я нашел это, используя numpy.argmin следующим образом:

I = np.zeros(A.shape[1], dtype=np.int64)
for j in range(A.shape[1]):
    I[j] = np.argmin(A[:, j])

Это дает мне I = [0, 0, 0, 0, 0, 0, 0, 0]. Поскольку есть связи, я мог бы получить следующее: I = [0, 1, 2, 3, 4, 0, 5, 1], где я разрываю связи по индексу, который меньше всего используется (из предыдущих индексов).

Более подробно:

  • Для j=0 у нас есть np.argmin(A[:, 0]) in [0, 1, 2, 3, 4, 5] и, скажем, мы выбираем np.argmin(A[:, 0]) = 0.
  • Для j=1 у нас есть np.argmin(A[:, 1]) in [0, 1, 2, 3, 4, 5], и мы должны выбрать минимальный индекс из [1, 2, 3, 4, 5], так как эти индексы используются наименее (мы уже выбираем np.argmin(A[:, 0]) = 0 для j=0). Скажем, мы выбираем np.argmin(A[:, 1])=1.
  • Для j=2 у нас есть np.argmin(A[:, 2]) in [0, 1, 2, 3, 4, 5], и мы должны выбрать минимальный индекс из [2, 3, 4, 5], так как эти индексы используются наименее.
  • Мы продолжаем в том же духе ...
  • Для j=5 у нас есть np.argmin(A[:, 5]) in [0, 1, 3, 4], и мы должны выбрать минимальный индекс из [0, 1, 3, 4], так как эти индексы используются наименее. Скажем, мы выбираем np.argmin(A[:, 5])=0.
  • Для j=6 у нас есть np.argmin(A[:, 6]) in [0, 1, 2, 4, 5], и мы должны выбрать из [5], так как эти индексы используются наименее. Мы выбираем np.argmin(A[:, 6])=5.
  • Для j=7 у нас есть np.argmin(A[:, 7]) in [0, 1, 2, 3, 4, 5], и мы должны выбрать из [1, 2, 3, 4, 5], так как эти индексы используются наименее. Скажем, мы выбираем np.argmin(A[:, 7])=1.

Надеюсь, это понятно. Мой вопрос: как найти минимальные индексы и разорвать связи по наименее используемым индексам в Python?

1 Ответ

0 голосов
/ 06 ноября 2018

Вы можете использовать мин в сочетании со словарем для хранения счетчиков каждого индекса:

import numpy as np

A = np.array([[1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 5, 1, 1, 1],
              [1, 1, 1, 1, 3, 3, 1, 1],
              [1, 1, 1, 1, 1, 1, 2, 1],
              [1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 1, 4, 1, 1]])

counts = {}
I = np.zeros(A.shape[1], dtype=np.int64)
for j in range(A.shape[1]):
    _, _, i = min([(v, counts.get(i, 0), i) for i, v in enumerate(A[:, j])])
    counts[i] = counts.get(i, 0) + 1
    I[j] = i

print(I)

выход

[0 1 2 3 4 0 5 1]

Идея состоит в том, чтобы создать следующий ключ: (value, count of index, index), а затем использовать обычное сравнение кортежей, поэтому, если значения равны, будет выбрано значение с меньшим количеством соответствующих индексов, если оба значения равны будет выбран тот, у которого индекс ниже.

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