从3d DataArray排序特定切片的数组值

时间:2018-09-13 13:05:22

标签: python numpy python-xarray

摘要:给定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()))

enter image description here

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

enter image description here

问题:

假设这些结果没有升序,我怎么能

1)根据order_costs对它们进行排序,同时将信息保留在“索引”(供应商名称,A,B或C)中

2)查找我相应订单成本的排名,例如如果我的订单费用为19,那么这将返回2。

我在选择上尝试了sortby()方法,但是如果我将'order_costs'作为变量传递,则会收到KeyError。按“变量”排序似乎不会产生正确的效果,尽管不会引发错误。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。

1)将我的选择设为1维

selection = selection[0]

2)通过实参变量

重新索引

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

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

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