【问题标题】:numpy recarray indexing based on intersection with external array基于与外部数组交集的numpy recarray索引
【发布时间】:2011-03-10 19:01:01
【问题描述】:

我正在尝试根据 recarrays 字段之一和外部数组之间的公共值对 numpy.recarray 中的记录进行子集化。例如,

a = np.array([(10, 'Bob', 145.7), (20, 'Sue', 112.3), (10, 'Jim', 130.5)],
        dtype=[('id', 'i4'), ('name', 'S10'), ('weight', 'f8')])
a = a.view(np.recarray)

b = np.array([10,30])

我想取 a.id 和 b 的交集来确定要从recarray中拉出哪些记录,这样我就回来了:

(10, '鲍勃', 145.7)
(10,“吉姆”,130.5)

天真地,我试过了:

common = np.intersect1d(a.id, b)
subset = a[common]

但这当然行不通,因为没有 a[10]。我还尝试通过在 id 字段和索引之间创建一个反向字典并从那里子集来做到这一点,例如

id_x_index = {}
ids = a.id
indexes = np.arange(a.size)
for (id, index) in zip(ids, indexes):
    id_x_index[id] = index

subset_indexes = np.sort([id_x_index[x] for x in ids if x in b])
print a[subset_indexes]

但是如果 a.id 有重复项,我将覆盖 id_x_index 中的 dict 值,因为在这种情况下我得到了

(10, '吉姆', 130.5)
(10,“吉姆”,130.5)

我知道我忽略了一些将适当索引放入recarray 的简单方法。感谢您的帮助。

【问题讨论】:

    标签: indexing numpy recarray


    【解决方案1】:

    在 Numpy 中最简洁的方法是

    subset = a[np.in1d(a.id, b)]
    

    【讨论】:

    • 好极了,这简直是最简洁的了。谢谢
    【解决方案2】:

    而且对于那些有旧版本numpy的人,你也可以这样做:

    subset = a[np.array([i in b for i in a.id])]
    

    【讨论】:

    • 谢谢,也可以。我试图通过列表理解来做到这一点,但显然语法并没有完全正确。如果可以的话,我会支持你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2014-06-04
    相关资源
    最近更新 更多