Расширенная нарезка: учитывая список индексов, выберите разные элементы из массива numpy

#python #python-3.x #numpy #slice

#python #python-3.x #numpy #нарезать

Вопрос:

Я внедряю алгоритм принятия решений. В daily_choices массиве есть два фрукта, которые можно выбирать каждый божий день, например:

 daily_choices = np.array([['apple','orange'],['strawberry','orange'],['watermelon','apple']])
  

Теперь у меня есть список, содержащий фрукты, которые я собираюсь выбирать каждый божий день:

 decision = [0,1,0] 
  

Я знаю некоторые базовые нарезки, такие как daily_choices[:,0] , что означает вырезание первого столбца и daily_choices[:,1] означает вырезание второго столбца.

Интересно, есть ли способ нарезать первый столбец в первой строке, второй столбец во второй строке, первый столбец в третьей строке, выполнив что-то вроде следующего

Ожидаемый результат

 Input  =>  daily_choices[:,[0,1,0]]
Output =>  ['apple', 'orange', 'watermelon']
  

Тем не менее, это не дает мне желаемого результата

Я знаю, что могу достичь желаемого результата, используя zip и для loop

 daily_decision
daily_decision = []
for choices, index in zip(daily_choices, decision):
    daily_decision.append(choices[index])
daily_decision
  

Но я хочу знать, возможно ли это сделать в одной строке.

Комментарии:

1. используйте daily_decision = [choices[index] for choices, index in zip(daily_choices, decision)]

Ответ №1:

Использование понимания списка

 choices = [['apple', 'orange'], ['strawberry', 'orange'], ['watermelon', 'apple']]
decisions = [0, 1, 0] 

daily_decisions = [day[decision] for day, decision in zip(choices, decision)]
print(daily_decisions)
  

[‘apple’, ‘orange’, ‘watermelon’]

Использование numpy

Это также можно решить с помощью индексации массива целых чисел NumPys:

 import numpy as np
daily_choices = np.array([['apple','orange'],['strawberry','orange'],['watermelon','apple']])
decisions = [0, 1, 0]

daily_decision = daily_choices[range(len(daily_choices)), decisions]
print(daily_decision)
  

[‘apple’, ‘orange’, ‘watermelon’]

Ответ №2:

Используя чисто numpy :

 import numpy as np

daily_choices = np.array([['apple', 'orange'],['strawberry', 'orange'],['watermelon', 'apple']])
decision = np.array([0, 1, 0])

n_fruits = 2

fruit_range = np.reshape(np.arange(n_fruits), (-1, n_fruits))
indices = np.reshape(decision, (len(decision), 1)) == fruit_range

daily_choices[indices]
  

Выходной сигнал:

 array(['apple', 'orange', 'watermelon'], dtype='<U10')