Am 06.08.21 um 16:38 schrieb Davide Cittaro:
Hi all, I'm trying to analyze a graph for which I have multiple layers and I'm finding difficulties in creating the graph. I have two graphs with the same vertex for which I define a edge property (the layer) like this:
(g_atac, dist_atac) = gt.generate_knn(A_data, k=n_neighbors) (g_rna, dist_rna) = gt.generate_knn(R_data, k=n_neighbors)
layer_atac = g_atac.new_edge_property('int') for e in g_atac.edges(): layer_atac[e] = 1 layer_rna = g_rna.new_edge_property('int') for e in g_rna.edges(): layer_rna[e] = -1 g_atac.edge_properties['layer'] = layer_atac g_rna.edge_properties['layer'] = layer_rna
I then merge the graphs by graph union, first defining a node mapping:
rna_mappings = g_rna.new_vertex_property("int") for x in range(g_atac.num_vertices()): rna_mappings[x] = x
and then performing the actual union:
gu = gt.graph_union(g_atac, g_rna, intersection=rna_mappings, internal_props=True)
This indeed creates the final graph, but I noticed that instead of two layers I have three:
np.unique(gu.edge_properties['layer'].a) PropertyArray([-1, 0, 1], dtype=int32)
Looking back at the start graphs I have zeros in the edge_properties as well
np.unique(g_rna.edge_properties['layer'].a) PropertyArray([-1, 0], dtype=int32)
np.unique(g_atac.edge_properties['layer'].a) PropertyArray([0, 1], dtype=int32)
and, similarly, the elements in the edge property vector are much higher than the number of edges:
print((len(g_rna.ep['layer'].a), g_rna.num_edges())) (156672, 14317)
which is different from what I can get from this:
g_rna.get_edges([g_rna.ep['layer']]).shape (14317, 3)
I'm evidently messing with (internal) properties and I'm clueless, any advice?
As is explained in the documentation, edge indexes need not to be contiguous (differently from vertex indexes, which are always contiguous). When accessing the property map values via the ".a" property, this returns an array indexed by the edge index, which will contain values for non-existing edges if the indexes are not contiguous. This is what you are seeing. If you want to see only the property values for existing edges, you should get a filtered array with the ".fa" property. Best, Tiago -- Tiago de Paula Peixoto <tiago@skewed.de>