【问题标题】:Matching elements in numpy array匹配numpy数组中的元素
【发布时间】:2013-06-28 22:24:45
【问题描述】:

我有两个 numpy 数组。第一个 Z1 大约有 300,000 行长和 3 列宽。第二个,Z2,大约有 200,000 行和 300 列。每个 Z1 和 Z2 的每一行都有一个标识号(10 位)。 Z2 包含 Z1 中的项目的子集,我想根据 10 位标识号将 Z2 中的行与 Z1 中的伙伴匹配,然后从 Z1 中取出第 2 列和第 3 列并将它们插入到 Z2 的末尾相应的行。

Z1 和 Z2 都没有任何特定的顺序。

我想出的唯一方法是遍历数组,这需要几个小时。有没有更好的方法在 Python 中做到这一点?

谢谢!

【问题讨论】:

    标签: python arrays sorting numpy


    【解决方案1】:

    从您的问题中我了解到,10 位标识符存储在第 1 列中,对吗?

    这不是很容易理解,很多间接发生,但最后unsorted_insertZ1Z2 的每个标识符的行号是

    sort_idx = np.argsort(Z1[:, 0])
    sorted_insert = np.searchsorted(Z1[:, 0], Z2[:, 0], sorter=sort_idx)
    # The following is equivalent to unsorted_insert = sort_idx[sorted_insert] but faster
    unsorted_insert = np.take(sort_idx, sorted_insert)
    

    所以现在我们需要做的就是获取这些行的最后两列并将它们堆叠到Z2 数组中:

    new_Z2 = np.hstack((Z2, Z1[unsorted_insert, 1:]))
    

    一个运行没有问题的虚构示例:

    import numpy as np
    
    z1_rows, z1_cols = 300000, 3
    z2_rows, z2_cols = 200000, 300
    
    z1 = np.arange(z1_rows*z1_cols).reshape(z1_rows, z1_cols)
    
    z2 = np.random.randint(10000, size=(z2_rows, z2_cols))
    z2[:, 0] = z1[np.random.randint(z1_rows, size=(z2_rows,)), 0]
    
    sort_idx = np.argsort(z1[:, 0])
    sorted_insert = np.searchsorted(z1[:, 0], z2[:, 0], sorter=sort_idx)
    # The following is equivalent to unsorted_insert = sort_idx[sorted_insert] but faster
    unsorted_insert = np.take(sort_idx, sorted_insert)
    new_z2 = np.hstack((z2, z1[unsorted_insert, 1:]))
    

    还没有计时,但整个事情似乎在几秒钟内完成。

    【讨论】:

    • 这似乎很有希望,但它给我一个错误:文件“/usr/lib64/python2.6/site-packages/numpy/core/fromnumeric.py”,第 807 行,在 searchsorted 返回 searchsorted (v,side)ValueError:关键字'side'的预期非空字符串当我在'Z1 [:,0],Z2 [:,0]周围加上括号时似乎不会发生这种情况,但是它需要永远运行并且不会'似乎什么都没做
    • 啊,但它确实给出了另一个错误,这是关于你的第 2 行,带有括号: sorted_insert = np.searchsorted((Z1[:, 0], Z2[:, 0]), sort_idx) 文件“/usr/lib64/python2.6/site-packages/numpy/core/fromnumeric.py”,第 806 行,在 searchsorted return _wrapit(a, 'searchsorted', v, side) 文件“/usr/lib64 /python2.6/site-packages/numpy/core/fromnumeric.py", line 37, in _wrapit result = getattr(asarray(obj),method)(*args, **kwds) ValueError: 数组的真值具有多个元素是模棱两可的。使用 a.any() 或 a.all()
    • @DathosPachy 我已经在我的答案中添加了一些虚构的示例数据,我可以运行它而不会出现任何重大问题。你用的是什么版本的numpy?是否可以选择更新到最新的 1.7?
    • 我正在运行 1.6.2。我会看到升级,因为同样的错误似乎出现在同一个地方。谢谢!
    • @DathosPachy 您可以尝试在对np.searchsorted的调用中简单地添加side关键字:sorted_insert = np.searchsorted(z1[:, 0], z2[:, 0], side='left', sorter=sort_idx)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多