我有以下矩阵
a = sp.random(150, 150)
x = np.random.normal(0, 1, size=(150, 20))
我基本上想实现以下公式
我可以这样计算内部差异
diff = (x[:, None, :] - x[None, :, :]) ** 2
diff.shape # -> (150, 150, 20)
a.shape # -> (150, 150)
我基本上想广播scipy稀疏矩阵和每个内部numpy数组之间的元素乘法。
如果A是稠密的,那么我可以简单地
np.einsum("ij,ijk->k", a.toarray(), (x[:, None, :] - x[None, :, :]) ** 2)
但是A是稀疏的,而且可能很大,所以这不是一个选项,当然,我可以重新排序轴,然后用for循环遍历diff
数组,但是使用numpy有更快的方法吗?
正如@hpaulj所指出的,当前的解决方案也形成了一个(150, 150, 20)
形状的数组,这也会立即导致内存问题,所以这个解决方案也不会是好的。
2条答案
按热度按时间nwsw7zdq1#
看起来相当快;这在大约一秒内完成:
vjhs03f72#
请尝试以下代码:
对于稀疏矩阵,可以使用以下代码:
其中a是形状[150,150]的COO(坐标格式)稀疏矩阵