首页 > 解决方案 > 高级切片:给定索引列表,从 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']

然而,它并没有给我想要的结果

我知道我可以通过使用zipand for来达到我想要的结果loop

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

但我想知道是否可以在一行中完成。

标签: pythonpython-3.xnumpyslice

解决方案


使用列表理解

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)

['苹果','橙子','西瓜']

使用 numpy

这也可以通过NumPys Integer Array Indexing解决:

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)

['苹果','橙子','西瓜']


推荐阅读