首页 > 解决方案 > 按指定月份屏蔽 Numpy 数组

问题描述

如果我有以下列表

import numpy as np
import datetime
a = [datetime.datetime(2017, 9, 13, 0, 0),
       datetime.datetime(2012, 6, 29, 0, 0),
       datetime.datetime(2012, 11, 28, 0, 0),
       datetime.datetime(2011, 4, 21, 0, 0),
       datetime.datetime(2011, 9, 18, 0, 0),
       datetime.datetime(2013, 2, 15, 0, 0),
       datetime.datetime(2014, 3, 12, 0, 0),
       datetime.datetime(2014, 8, 11, 0, 0),
       datetime.datetime(2015, 1, 9, 0, 0),
       datetime.datetime(2013, 7, 15, 0, 0),
       datetime.datetime(2015, 3, 7, 0, 0),
       datetime.datetime(2015, 8, 5, 0, 0),
       datetime.datetime(2016, 1, 2, 0, 0),
       datetime.datetime(2016, 6, 10, 0, 0),
       datetime.datetime(2016, 11, 7, 0, 0),
       datetime.datetime(2017, 4, 3, 0, 0),
       datetime.datetime(2017, 9, 11, 0, 0),
       datetime.datetime(2018, 2, 9, 0, 0)]

我需要找到包含 1 月至 5 月和 10 月至 12 月之间月份的元素索引。

我最初的尝试如下:

b =[i.strftime("%m") for i in dates]
b = np.array(b).astype(int)
idx = np.argwhere((b<6) | (b>9))
d_a = np.array(a)
result = d_a[idx]

女巫返回所需的result

array([[datetime.datetime(2012, 11, 28, 0, 0)],
       [datetime.datetime(2011, 4, 21, 0, 0)],
       [datetime.datetime(2013, 2, 15, 0, 0)],
       [datetime.datetime(2014, 3, 12, 0, 0)],
       [datetime.datetime(2015, 1, 9, 0, 0)],
       [datetime.datetime(2015, 3, 7, 0, 0)],
       [datetime.datetime(2016, 1, 2, 0, 0)],
       [datetime.datetime(2016, 11, 7, 0, 0)],
       [datetime.datetime(2017, 4, 3, 0, 0)],
       [datetime.datetime(2018, 2, 9, 0, 0)]], dtype=object)

这可以改进/简化为不使用列表理解吗?

标签: pythonnumpydate

解决方案


如果您的目标是获取result,则可以在不获取搜索元素索引的情况下执行以下操作:

a_arr = np.array(a)
filter_func = np.vectorize(lambda x: True if x.month not in [6, 7, 8, 9] else False)
result = a_arr[filter_func(a_arr)]

但是,如果您想获取搜索元素的索引,可以通过以下方式获取它们:

indices = np.where(filter_func(a_arr))

推荐阅读