为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要花这么长时间,Numpy 数组过滤代码?

为什么要花这么长时间,Numpy 数组过滤代码?

Smart猫小萌 2021-12-17 16:15:59
我有这段代码可以从零行过滤大型 numpy 数组(6000000 行)。nonZero_training_data=[]for i in get_training_data:    if (np.equal(i[0],[[0,0,0,0],[0,0,0,0]]).all()):        continue    nonZero_training_data=nonZero_training_data+[i]数组中的每一行像这样: [(array([[x1,x2,x3,x4], [x1,x2,x3,x4]]), y),]但是执行时间很长,可能需要一分钟或更长时间。这是 get_training_data 中的前 5 行:array([[array([[0.2, 0., 0., 0.],       [0.9, 0., 0., 3.]]),        1],       [array([[0., 4., 1., 0.],       [0., 0., 1., 0.]]), 1],       [array([[2., 0., 7., 0.],       [0., 0., 1., 8.]]),        0],       [array([[0., 5., 0., 2.],       [0., 8., 0., 1.]]),        0],       [array([[0., 1., 0., 1.],       [0., 5., 0., 0.]]),        1]], dtype=object)有没有更有效的方法来做到这一点?对不起我的英语,任何更正我都会很感激。
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

我不是 numpy 的专家,但显然你的目标只是通过过滤一些元素来构建一个列表。您可以使用列表理解来实现这一点,它既快又短:

nonZero_training_data = [i for i in get_training_data if not (np.equal(i[0],[[0,0,0,0],[0,0,0,0]]).all())]

无论如何,你的代码很慢并不奇怪:当你这样做时,你每次尝试附加一个元素时都会构建和复制一个新列表:

nonZero_training_data = nonZero_training_data + [i]

这产生了二次时间复杂度。您绝对应该通过将其替换为以下内容来体验改进:

nonZero_training_data.append(i)

它将新元素附加到位,而不是构建一个新列表,然后将其复制到您的变量中。


查看完整回答
反对 回复 2021-12-17
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

这是一个仅使用 numpy 的解决方案,应该比列表理解更快。


vfunc = np.vectorize(lambda x: not isinstance(x,int) and np.all(x[0] == [[0,0,0,0],[0,0,0,0]]))

mask = vfunc(get_training_data)[:,0]


get_training_data[~mask]

没有矢量化:


mask = ~np.apply_along_axis( lambda x: np.all(x[0] == [[0,0,0,0],[0,0,0,0]]), arr = get_training_data,axis= 1)

get_training_data[mask]


查看完整回答
反对 回复 2021-12-17
  • 2 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号