有没有办法广播布尔掩码?
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
我正在尝试减少基于搜索距离的计算次数。我有 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