我有这段代码可以从零行过滤大型 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)
它将新元素附加到位,而不是构建一个新列表,然后将其复制到您的变量中。

慕侠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]
添加回答
举报
0/150
提交
取消