有没有办法广播布尔掩码?

Is there a way to broadcast boolean masks?

我正在尝试减少基于搜索距离的计算次数。我有 N 个节点和一个 [NxN] 布尔掩码,它告诉我哪些节点在其他节点的 X 距离内,具有 T 真值。

我还有每个节点的 [Nx(d)] 数据,其中 (d) 可以是 (1)(3)(3x3)。我想要 "sparse" 格式,它是一个 [Tx(d)] 数组,因此我可以沿 0 轴进行矢量化计算。现在我这样做:

sparseData=data.repeat(data.shape[0],axis=0).reshape(np.concatenate(([data.shape[0],data.shape])))[mask]

这有效,但如果 N 太大会导致内存错误,因为我用 .repeat 创建的 [NxNx(d)] 数组有没有办法广播这个?如果我这样做:

data[None,...][mask]

它不起作用,但似乎必须有更有效的方法来做到这一点。

您可以使用 numpy.broadcast_to 查看数据,而不是重复数据:

sparseData = np.broadcast_to(data, (data.shape[0],) + data.shape)[mask]

但是,select 基于索引的数据行更容易:

I, J = np.nonzero(mask)
sparseData = data[I]  # could also use J