基于内部结构化数组的Numpy结构化数组查询

时间:2018-08-23 11:46:08

标签: python numpy indexing data-science

我有一个类似以下的结构:

product_type = np.dtype([('message_counter', np.int),
                         ('alteration_time', 'U32'),
                         ('area_states', status_type, (3,)),
                        ])

具有:

status_type = np.dtype([('area', 'U32'),
                        ('state', 'U32')])

此外,我有一个product_type数组,例如:

products = np.array([product1, product2, ...], dtype=product_type)

现在,我要选择仅具有status_type等于('area1', 'active')的产品。我将如何实现这一目标。我尝试过类似的事情:

mask = np.isin(products['area_states'][['area', 'state']],
              ('area1', 'active'))
active_products = products[mask]

不幸的是,这并没有达到我希望的方式。当然,我只收到了用于子数组(status_type)的遮罩,但是我希望对产品使用遮罩,以便可以用status_type过滤仅具有('area1', 'active')的产品。

因此所有代码如下:

status_type = np.dtype([('area', 'U32'),
                        ('state', 'U32')])
product_type = np.dtype([('message_counter', np.int),
                         ('alteration_time', 'U32'),
                         ('area_states', status_type, (3,)),
                         ])
products = np.array([(253, '12:00', [('area1', 'active'), ('area2', 'inactive'), ('area3', 'inactive')]),
                     (254, '13:00', [('area1', 'inactive'), ('area2', 'inactive'), ('area3', 'inactive')])],
                    dtype=product_type)
active_products_in_area1 = '???'

1 个答案:

答案 0 :(得分:1)

您可以使用

创建目标状态变量
status = np.array(('area1', 'active'), dtype=status_type)

并使用np.any获取有效产品掩码(沿{1}列表沿轴1的循环减小)

status_type

仅产生示例数组中的第一条记录:

mask = (products['area_states'] == status).any(axis=1)
active_products_in_area1 = products[mask]