首页 > 解决方案 > 从 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。按“变量”排序似乎没有正确的效果,尽管不会引发错误。

我究竟做错了什么?

标签: pythonnumpypython-xarray

解决方案


我想我找到了答案。

1) 将我的选择设为一维

selection = selection[0]

2) 通过 argsorted 变量重新索引

selection = selection[selection.variable.argsort()]

3)现在应该对选择进行排序,并且您也可以查看该supplier列的索引。

我查看了返回的索引argsort(),它们似乎与 order_value 顺序不匹配,但是当我实际使用它时,它给了我正确的答案。


推荐阅读