Поэлементный минимум двух массивов numpy, индексированных другим массивом

У меня есть три массива фигур:

A = a = np.random.exponential(1, [10, 1000000])  # of shape (10, 1000000)
B = a = np.random.exponential(1, [10, 1000000])  # of shape (10, 1000000)

Я вычислил другой массив IND[], как показано ниже. Каждый элемент IND[] является индексом максимального элемента A (максимум каждых 10 значений в столбце),

IND = np.argmax(snr_sr, axis=0)  # of shape (1000000,)

Я хочу вычислить другой массив C, который содержит поэлементные минимальные значения A и B в строке #, заданной значениями IND[]. Таким образом, массив C должен иметь форму (1, 1000000). Я хочу избежать циклов for. Я пробовал ниже, но значения C неверны.

for j in range(0, A.shape[1]):    
        m  = ind[j]
        C  = minimum(A[m,:], B[m,:])  # return 1x1000000 array

Извините, так как массивы большие, не смог выложить. Вы можете взять любые массивы одинаковых фигур.

Первое редактирование: кто-то дал мне правильный ответ, но удалил его (не знаю почему?). Во всяком случае, я скопировал ответ до того, как он его удалил. Пожалуйста, опубликуйте это снова, чтобы я мог отметить это правильно. (Ему: Кто для простоты взял массивы по 1100).


person Muhammad Asif Khan    schedule 08.07.2018    source источник
comment
вы нашли argmax, но не argmin?   -  person bobrobbob    schedule 08.07.2018
comment
Сначала вычислите минимум A и B построчно и сохраните его в массиве; затем проиндексируйте этот массив, используя ind.   -  person today    schedule 08.07.2018
comment
Можете ли вы предоставить 2 массива из 5 элементов и показать нам, что вам нужно в качестве ожидаемого результата?   -  person jpp    schedule 08.07.2018


Ответы (2)


Я сократил ваши массивы:

a = np.random.exponential(1, [10, 100])  # of shape (10, 100)
b = np.random.exponential(1, [10, 100])
ind=np.argmax(a,axis=0)

Используйте этот ind, чтобы выбрать одну строку для каждого столбца в a и b:

a_ = a[ind,np.arange(a.shape[1])]
b_ = b[ind,np.arange(a.shape[1])]

А затем вычислить c:

c=np.minimum(a_, b_)
person Brenlla    schedule 08.07.2018
comment
Спасибо. Это прекрасно решено. Что, если ind — это случайный выбор по оси = 0 вместо максимума?? - person Muhammad Asif Khan; 08.07.2018
comment
Должно быть то же самое, если ind ›9 выдаст ошибку индексации - person Brenlla; 08.07.2018
comment
Нет, я имею в виду, если мне нужен индекс случайно выбранных элементов двух массивов вместо ind = np.argmax(a, axis=0), например, ind=np.argrandom(a, axis=0) (np .argrandom не существует, мне просто интересно, существует ли такая функция?) - person Muhammad Asif Khan; 08.07.2018
comment
Вычислить случайное ind? Используйте модуль random: ind=np.random.randint(0,10,a.shape[0]) - person Brenlla; 08.07.2018
comment
Я думаю, это работает. Позвольте мне убедиться в этом, увидев окончательные результаты. Большое спасибо, Бренелла. Вы были очень полезны. - person Muhammad Asif Khan; 08.07.2018

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

Сначала найдите минимум значений в A и B построчно:

minAB = np.min(np.minimum(A, B), axis=1)

Затем проиндексируйте этот массив, используя ind:

C = minAB[ind]
person today    schedule 08.07.2018