【问题标题】:Binning then sorting arrays in each bin but keeping their indices togetherBinning 然后在每个 bin 中对数组进行排序,但将它们的索引保持在一起
【发布时间】:2017-03-12 20:23:44
【问题描述】:

我有两个数组,这些数组的索引是相关的。所以 x[0] 与 y[0] 相关,所以它们需要保持井井有条。我已将 x 数组分箱到两个箱中,如下面的代码所示。

x = [1,4,7,0,5]
y = [.1,.7,.6,.8,.3]

binx = [0,4,9]
index = np.digitize(x,binx)

给我以下内容:

In [1]: index
Out[1]: array([1, 2, 2, 1, 2])

到目前为止一切顺利。 (我认为)

y 数组是一个参数,告诉我 x 数据点的测量结果有多好,因此 0.9 比 0.2 好,所以我使用下一个代码来整理出最好的 y 数组:

y.sort() 
ysorted = y[int(len(y) * .5):]

这给了我:

In [2]: ysorted
Out[2]: [0.6, 0.7, 0.8]

给我数组的最后 50%。再说一次,这就是我想要的。

我的问题是如何结合这两个操作?从每个 bin 中,我需要得到最好的 50% 并将这些新值放入一个新的 x 和新的 y 数组中。同样,保持每个数组的索引井井有条。或者有没有更简单的方法来做到这一点?我希望这是有道理的。

【问题讨论】:

标签: arrays python-2.7 numpy


【解决方案1】:

许多numpy 函数具有arg... 变体,它们不是“按值”操作,而是“按索引”操作。在你的情况下,argsort 做你想做的事:

order = np.argsort(y)
# order is an array of indices such that
# y[order] is sorted
top50 = order[len(order) // 2 :]
top50x = x[top50]
# now top50x are the x corresponding 1-to-1 to the 50% best y

【讨论】:

    【解决方案2】:

    你应该从你的 x 和 y 列表中创建一个对的列表

    可以通过zip功能实现:

    x = [1,4,7,0,5]
    y = [.1,.7,.6,.8,.3]
    values = zip(x, y)
    values
    [(1, 0.1), (4, 0.7), (7, 0.6), (0, 0.8), (5, 0.3)]
    

    要按每对的特定元素对这样的对列表进行排序,您可以使用排序的关键参数:

    values.sort(key=lambda pair: pair[1])
    [(1, 0.1), (5, 0.3), (7, 0.6), (4, 0.7), (0, 0.8)]
    

    然后你可以用这个排序的对列表做任何你想做的事情。

    【讨论】:

    • 所以,这真的很酷!但是如何只访问对列表中的 x 分量,以便将它们分类到 bin 中?
    • values[i][0] 是 x 分量,values[i][1] 是 y 分量。我所说的那些“对”是元组,它们的工作方式非常类似于列表
    • 那么,index = np.digitize(values[i][0],binx) 应该有效吗?没有,我做错了什么?
    • 对numpy不太熟悉。您究竟需要将什么作为第一个参数传递给 np.digitize?
    • 使用我的代码,您可以获得配对列表。如果您需要将按保存在 y 列表中的精度排序的 x 列表传递给 np.digitize,则需要从对列表中检索 x 值,例如 [pair[0] for pair in values]
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多