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

我有这段代码可以从零行过滤大型 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)

有没有更有效的方法来做到这一点?


对不起我的英语,任何更正我都会很感激。


Smart猫小萌
浏览 188回答 2
2回答

qq_笑_17

我不是 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

这是一个仅使用 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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python