我想从另一个数组中提取满足多个条件的行。
这就是原始数组的样子:
original = array([[Timestamp('2018-01-15 01:59:00'), 329, 30, 5],
[Timestamp('2018-01-15 01:59:00'), 326, 25, 3],
[Timestamp('2018-01-15 02:00:00'), 324, 22, 34],
...,
[Timestamp('2018-01-15 21:57:00'), 322, 23, 3],
[Timestamp('2018-01-15 21:57:00'), 323, 30, 9],
[Timestamp('2018-01-15 21:59:00'), 323, 1, 19]], dtype=object)
条件是:
1)第3或第4值大于25
2)第3或第4值比其他值大两倍
3)在01:00~06:00之间收到值
因此,根据条件,将提取第一行。 (30比大于25 | 30大于2 |大于两倍于01:59:00,即01:00~06:00之间的行)
是否可以仅使用np.where
执行此操作?
编辑:我可以用pandas完成这项工作。
>>> df_text = pd.DataFrame( trade_reset , columns=['date', 'freq', 'in', 'out'])
>>> df_text = df_text[(df_text['in'] >= 30 ) | (df_text['out'] >= 30 )]
>>> df_text = df_text[(df_text['in'] > df_text['out']*2 ) | (df_text['out'] >= df_text['in']*2 )]
>>> df_text[ (df_text['date'] < datetime(2018, 1, 15, 6)) & (df_text['date'] > datetime(2018, 1, 15, 1)) ]
答案 0 :(得分:1)
为方便起见,请将Timestamp
定义为np.datetie64
创建者:
In [492]: Timestamp=lambda x: np.datetime64(x, 's')
In [493]: Timestamp('2018-01-15 01:59:00')
Out[493]: numpy.datetime64('2018-01-15T01:59:00')
In [494]: original = np.array([[Timestamp('2018-01-15 01:59:00'), 329, 30, 5],
...: [Timestamp('2018-01-15 01:59:00'), 326, 25, 3],
...: [Timestamp('2018-01-15 02:00:00'), 324, 22, 34],
...: [Timestamp('2018-01-15 21:57:00'), 322, 23, 3],
...: [Timestamp('2018-01-15 21:57:00'), 323, 30, 9],
...: [Timestamp('2018-01-15 21:59:00'), 323, 1, 19]], dty
...: pe=object)
...:
In [495]: original
Out[495]:
array([[numpy.datetime64('2018-01-15T01:59:00'), 329, 30, 5],
[numpy.datetime64('2018-01-15T01:59:00'), 326, 25, 3],
[numpy.datetime64('2018-01-15T02:00:00'), 324, 22, 34],
[numpy.datetime64('2018-01-15T21:57:00'), 322, 23, 3],
[numpy.datetime64('2018-01-15T21:57:00'), 323, 30, 9],
[numpy.datetime64('2018-01-15T21:59:00'), 323, 1, 19]],
dtype=object)
现在我们可以用时间来测试:
In [500]: original[:,0]<Timestamp('2018-01-15 06:00:00')
Out[500]: array([ True, True, True, False, False, False])
In [501]: original[:,0]>Timestamp('2018-01-15 01:00:00')
Out[501]: array([ True, True, True, True, True, True])
In [502]: mask = Out[500] & Out[501]
In [503]: mask
Out[503]: array([ True, True, True, False, False, False])
对第2列和第3列进行测试
In [509]: (original[:,[2,3]]>=30).any(axis=1)
Out[509]: array([ True, False, True, False, True, False])
和
In [506]: (original[:,2]>(original[:,3]*2)) | (original[:,3]>=(original[:,2]*2))
...:
Out[506]: array([ True, True, False, True, True, True])
和在一起
In [510]: mask & Out[509] & Out[506]
Out[510]: array([ True, False, False, False, False, False])
In [511]: np.where(Out[510])
Out[511]: (array([0]),)
有时object
dtype会妨碍计算,通常它不会将任务委托给对象的方法。这里可以比较Python整数,因此也可以比较对象数组。在一个大型数组中,如果数组的一部分首次转换为二维数字数组,这些比较可能会更快。
In [512]: original[:,1:].astype(int)
Out[512]:
array([[329, 30, 5],
[326, 25, 3],
[324, 22, 34],
[322, 23, 3],
[323, 30, 9],
[323, 1, 19]])
Pandas似乎对处理对象dtypes感到“更开心”,但我认为灵活性会带来速度成本。