Почему это так долго, Numpy массив фильтрации кода? - PullRequest
0 голосов
/ 27 марта 2019

У меня есть этот код для фильтрации большого массива 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]

каждая строка в массиве выглядит следующим образом: [(массив ([[x1, x2, x3, x4]), [x1, x2, x3, x4]]), y),]

Но время выполнения велико, может занять минуту или больше.

Это первые 5 строк в get_training_data:

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 ]

1 голос
/ 27 марта 2019

Вот решение, которое использует только 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]
1 голос
/ 27 марта 2019

Я не эксперт по 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)

, который добавляет новый элемент на место вместо создания нового списка, а затем копирует его в вашу переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...