Как создать пустые списки в массивном логическом массиве, который идентифицирует пустые списки? - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь создать логический массив, который идентифицирует пустые списки в массиве. Я сделал следующий код:

import numpy as np
from scipy.spatial import cKDTree

rand_points = np.random.rand(5,3)

other_points = np.zeros((5,3))
for i in range(3):
   other_points[:,i] = rand_points[:,i] * 2

randTree = cKDTree(rand_points)
nearPoints = cKDTree.query_ball_point(randTree, other_points, 0.6)

nearPoints может выдавать следующий результат:

array([list([]), list([]), list([2]), list([]), list([])], dtype=object)

Я хотел бы создать логический массив, который выбирает элементы, равные list([ ]) как True. Я пробовал несколько подходов, но не удалось, например:

nearPoints == None

Как бы я правильно создал логический массив?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вы можете просто сделать это:

~nearPoints.astype(bool)
0 голосов
/ 28 октября 2018

Если у вас есть массивы с dtype=object, то производительности говорить не приходится, и, очевидно, именно это cKDTree дает вам.Так что с тем же успехом можно просто создать массив с пониманием списка:

>>> np.array([len(lst)==0 for lst in nearPoints])
array([ True,  True,  True, False,  True])

Или, если вы предпочитаете map пониманию списка (я не делаю):

~np.fromiter(map(len, nearPoints), dtype=bool)

Вкл.на более высоком уровне, вероятно, вы мало что можете сделать с точки зрения векторизованных операций с таким массивом списков, так что вы, вероятно, в конечном итоге перебираете массив.Но тогда вы можете сделать

for lst in nearPoints:
    if not lst:
        # skip empty list cases
        continue
...