#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')