python - 从 3d DataArray 中对特定切片的数组值进行排序
问题描述
摘要:给定一个 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。按“变量”排序似乎没有正确的效果,尽管不会引发错误。
我究竟做错了什么?
解决方案
我想我找到了答案。
1) 将我的选择设为一维
selection = selection[0]
2) 通过 argsorted 变量重新索引
selection = selection[selection.variable.argsort()]
3)现在应该对选择进行排序,并且您也可以查看该supplier
列的索引。
我查看了返回的索引argsort()
,它们似乎与 order_value 顺序不匹配,但是当我实际使用它时,它给了我正确的答案。
推荐阅读
- javascript - 比较数组中的多个对象并在某个公共值时求和,JavaScript / Vue.js
- spring - 如何返回带有错误响应的 Http 状态行?
- java - 试图理解Java中结合布尔和逻辑运算符的代码块
- python - Django:如何从基本模型类的实例中填充继承的表单字段?
- c++ - 如何创建多个视口,每个视口都有不同的场景?
- javascript - 如何在 Jest 测试中真正调用 fetch
- c# - 如何绑定列表
动态属性 - swift - 在 swift 类之间共享数据
- c# - `x?.ToString("C")` 和 `$"{x:C}"` 之间有什么区别吗?
- apache-spark - 如何在 Kubernetes 上使用 Spark 修复“禁止!配置的服务帐户无权访问”?