【问题标题】:Pulling elements in order based on first element using key array使用键数组根据第一个元素按顺序拉取元素
【发布时间】:2019-07-10 17:59:12
【问题描述】:

我正在为以下问题寻找矢量化方法:

假设我有两个数组,一个在第一列中有一堆不连续的 id,在其余列中有一些数据,第二个数组建议我需要提取哪些数据线:

data_array = np.array([[101,4],[102,7],[201,2],[203,9],[403,12]])
key_array = np.array([101,403,201])

输出必须保持 key_array 给定的顺序,导致以下结果:

output_array = np.array([[101,4],[403,12],[201,2]])

我可以通过列表理解轻松做到这一点:

output_array = np.array([data_array[i==data_array[:,0]][0] for i in key_array])

但这不是矢量化解决方案。使用 numpy isin() 非常接近工作,但不保留给定的顺序:

data_array[np.isin(data_array[:,0],key_array)]

#[[101   4]
# [201   2] not the order given by the key_array!
# [403  12]]

我尝试通过使用 argsort() 来完成上述工作,但没有任何工作。任何帮助将不胜感激。

【问题讨论】:

  • data_array[np.isin(data_array[:,0],key_array)]?
  • 这不起作用,因为我在密钥数组中给出的顺序没有保留。我将编辑帖子以使其更清楚。
  • 是否所有来自key_array 的键都承诺在data_array 的第一列中?
  • 是的,key_array最初是根据data_array确定的。

标签: python arrays numpy vectorization


【解决方案1】:

我们可以使用np.searchsorted -

s = data_array[:,0].argsort()
out = data_array[s[np.searchsorted(data_array[:,0],key_array,sorter=s)]]

如果data_array的第一列已经排序,则简化为单行-

out = data_array[np.searchsorted(data_array[:,0],key_array)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多