摘要:给定3D数组,我如何在两个特定的坐标上进行切片,然后对第3维的VALUES进行排序,保留索引信息
序言:
我正在为购买苹果和香蕉的顾客比较购物篮的成本。我知道我们竞争对手的这些水果的单位成本,并且根据我选择的成本,我可以更便宜或更昂贵。我希望能够对竞争对手中特定组合(例如3个苹果和15个香蕉)的购物篮成本进行排名。
我试图包括所有相关代码,但真正的重点是最后。
1)构建一个函数,该函数获取苹果和香蕉的价格点,并返回订单成本网格:
apple_range = np.arange(1, 12, 1)
banana_range = np.arange(5, 30, 5)
def order_costs(no_apples, no_bananas, apple_cost=None, banana_cost=None):
return (no_apples * apple_cost) + (no_bananas * banana_cost)
fv = np.vectorize(order_costs, excluded=['apple_cost', 'banana_costs'])
2)我的竞争对手将价格定为数据框,然后将3D numpy数组与每个竞争对手的“深度”轴一起使用
fruit_prices = pd.DataFrame(
data = [[1,2], [3,4], [5,6]],
index = ['A', 'B', 'C'],
columns = ['apple_cost', 'banana_cost'],
)
order_costs_dict = {}
for idx, row in fruit_prices.iterrows():
order_costs_dict[idx] = fv(apple_range[:, np.newaxis], banana_range, **dict(row))
order_costs = np.dstack(list(order_costs_dict.values()))
3)将数据转换为DataArray
bvs_dataset = xr.Dataset(
{'order_costs':(['apples', 'bananas', 'supplier'], order_costs)},
coords = {'apples': (['apples'], apple_range),
'bananas': (['bananas'], banana_range),
'supplier': (['supplier'], list(order_costs_dict.keys()))}
)
bvs_array = bvs_dataset.to_array()
现在我进行选择,我想知道订购1个苹果和5个香蕉的费用
4)
selection = bvs_array.sel(apples=1, bananas=5)
selection
问题:
假设这些结果没有升序,我怎么能
1)根据order_costs对它们进行排序,同时将信息保留在“索引”(供应商名称,A,B或C)中
2)查找我相应订单成本的排名,例如如果我的订单费用为19,那么这将返回2。
我在选择上尝试了sortby()
方法,但是如果我将'order_costs'作为变量传递,则会收到KeyError。按“变量”排序似乎不会产生正确的效果,尽管不会引发错误。
我在做什么错了?
答案 0 :(得分:0)
我想我找到了答案。
1)将我的选择设为1维
selection = selection[0]
2)通过实参变量
重新索引 selection = selection[selection.variable.argsort()]
3)现在应该对选择进行排序,并且您也具有查看supplier
列的索引。
我查看了argsort()
返回的索引,它们似乎不符合order_value的顺序,但是当我实际使用它时,它给了我正确的答案。