numpy.extract 和 numpy.any 函数,是否有更简便的方法?

2 投票
1 回答
1465 浏览
提问于 2025-04-15 15:07

如果有办法让这段代码更简单,我会非常感激!我想要去掉那些全是零的行。第一列是日期。如果其他所有列都是零,那这一行就得被删除。列的数量是变化的。

import numpy as np

condition = [ np.any( list(x)[1:] ) for x in r]
r = np.extract( condition, r )

numpy.extract 文档

1 个回答

4

你可以不使用列表推导,而是用一种叫做“花式索引”的方法:

#!/usr/bin/env python
import numpy as np
import datetime
r=np.array([(datetime.date(2000,1,1),0,1),
            (datetime.date(2000,1,1),1,1),
            (datetime.date(2000,1,1),1,0),
            (datetime.date(2000,1,1),0,0),                        
            ])
r=r[r[:,1:].any(axis=1)]
print(r)
# [[2000-01-01 0 1]
#  [2000-01-01 1 1]
#  [2000-01-01 1 0]

如果 r 是一个 ndarray(就是一种数组),那么 r[:,1:] 就是去掉第一列后的视图。

r[:,1:].any(axis=1) 会生成一个布尔数组,这个数组可以用作“花式索引”。

撰写回答