Numpy поэлементное сравнение - PullRequest
2 голосов
/ 19 марта 2019

Я пытаюсь сделать что-то вроде этого:

I[ x<sub>r1,c1</sub> > x<sub>r2,c2</sub> ]

, где r i , c i ∈ {0,1,2, ..., n} - индексы строк и столбцов соответственно, а I [·] - это функция индикатора, значение которой равно 1, если условие истинно, и 0, в противном случае.

У меня проблемы с настройкой,Я могу легко перебрать все по:

for r1 in range(0,n):
    for c1 in range(0,n):
        for r2 in range(0,n):
            for c2 in range(0,n):
                #do something with (r1,c1,r2,c2)

Однако я пытаюсь векторизовать этот код, чтобы повысить эффективность и сделать сравнения одним махом.Как я могу это сделать?Я использую numpy .


обновление объяснения:

я тренирую простой классификатор улыбки, которыйанализирует изображение в градациях серого x ∈ R 24 × 24 и выводит прогноз y ∈ {0,1}, указывающий, является ли изображение улыбающимся (1) или нет (0).классификатор будет принимать решение на основе очень простых характеристик входного изображения, состоящих из двоичных сравнений между значениями пикселей.

каждая функция вычисляется как:

I[ x<sub>r1,c1</sub> > x<sub>r2,c2</sub> ]

где r i, c i ∈ {0,1,2, ..., n} - индексы строк и столбцов соответственно, а I [·] - индикаторная функция, значение которой равно 1, еслиусловие истинно и 0 в противном случае.(предположим, что n определено)

на основании того, что я упомянул до сих пор, я пытаюсь обучить ансамблевую классификацию улыбки для 5 функций.выходной сигнал ансамбля равен 1, если он думает, что изображение улыбается, и 0 в противном случае.это определяется средним прогнозом по всем 5 членам ансамбля.если более половины из 5 предсказателей ансамбля считают, что изображение улыбается, тогда ансамбль говорит, что это улыбка;в противном случае ансамбль говорит, что не улыбается.

это то, что я пытаюсь сделать:

в каждом раунде j, я хочу выбрать функцию jth (r1, c1, r2, c2) так, чтобы - когда она была добавленак набору j-1 признаков, которые уже были выбраны - точность общего классификатора на обучающем наборе максимальна.более конкретно, в каждом раунде j я рассматриваю каждый возможный кортеж местоположений пикселей (r1, c1, r2, c2), если текущий кортеж еще лучший (для раунда j), то я сохраняю его как свой «лучше всего увиденный еще».За раунд j.если нет, я игнорирую это.Затем я перехожу к следующему возможному кортежу местоположений пикселей и повторяюсь, пока не буду искать их все.В конце раунда j я выберу лучшую функцию для этого раунда и добавлю ее в свой набор выбранных функций.однажды добавленный, он остается в наборе навсегда - его нельзя удалить.(иначе, это не будет согласованный алгоритм вообще.) Затем я перехожу к раунду j + 1, пока вы не закончите все 5 раундов.

Мне не нужна помощь во всем этом.я просто ищу способ векторизовать код без использования вложенных циклов

1 Ответ

3 голосов
/ 19 марта 2019

Воспользуйтесь вещанием :

first = np.reshape(array, (*array.shape, 1, 1))
second = np.reshape(array, (1, 1, *array.shape))

result = (first > second)

В качестве альтернативы мы можем использовать np.greater.outer, который выполняет сравнение больше, чем каждая уникальная перестановкаэлементы:

result = np.greater.outer(array, array)

Это создаст np.ndarray формы (*array.shape, *array.shape), где result[r1, c1, r2, c2] - желаемое значение.

Пример:

array = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])

first = np.reshape(array, (*array.shape, 1, 1))
second = np.reshape(array, (1, 1, *array.shape))

result = (first > second)

print(result[0, 0, 1, 1]) # 1 > 6
print(result[1, 1, 0, 1]) # 6 > 2
print(result[0, 3, 0, 2]) # 3 > 2

Вывод:

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