我目前正在研究非常大的数据集上的(手动和高维)特征提取。我在图中以最简单的形式i -> j
编码n 2 边。
我正在利用这些功能独立于i -> j
关系,并且可以简单地使用ala encode(i, target=False)
,encode(j, target=True)
进行编码。这样,我可以在线性时间(n
时间而不是n²
)对单个图表进行编码。
此数据被编码为形状的张量:
# E :: (n, 2, d)
d
是要素维度。因此,索引到边缘是通过以下方式实现的:
# edge_ij = np.concat([E[source_node, 0, :), E[target_node, 1, :]], axis=-1)
我现在面临的挑战是,我希望将这个ndarray与最终形状E' :: (n,n,d*2)
连接起来,以便我可以利用它来索引权重向量W
并计算得分,ala:
graph_features = W[E']
graph_scores = graph_features.sum(axis=-1)
还有更多计算,我想用得到的图形得分,但如果解决了这个问题就解决了。
我的所有方法都导致了大量不必要的数组分配,我需要避免这些分配使我的实验变得可行。
是否有可能创建某种内存视图? (cython是触手可及的)
有什么想法吗?
答案 0 :(得分:0)
您问题的核心似乎是如何查看形状为(n, 2, d)
的数组为(n, n, d*2)
形状的数组。由于(2, d)
从(d*2)
更改为reshape()
是微不足道的,因此我将忽略该部分,并专注于将1D数组视为2D方阵。
您可以使用stride_tricks.broadcast_to():
line = np.arange(10)
square = np.lib.stride_tricks.broadcast_to(line, (10, 10))
这使得square
成为line
的视图(意味着它不会超出一些不变的额外内存),所有值都会重复10次。