1

我正在尝试创建一个布尔数组来标识数组中的空列表。我做了以下代码:

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([ ])as 的元素True。我尝试了多种方法,但都没有成功,例如:

nearPoints == None

我将如何正确创建布尔数组?

4

2 回答 2

1

如果您有带有 的数组,则没有太多性能可言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
于 2018-10-28T20:42:34.243 回答
1

你可以简单地这样做:

~nearPoints.astype(bool)
于 2018-10-28T20:56:33.333 回答