How to effectively get the nested blockmodel block memberships of each of the nodes in your graph

Hello Graph Tool developers,

I'm interested in the nested stochastic block model (nsbm). What interests
me most is: when I fit the model, where did each of my nodes get clustered?
The closest function I can find to this in the API by reading the docs is:

nsbm.get_bs()

which returns

[PropertyArray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32),
PropertyArray([1, 1, 2, 2, 3, 4, 5, 0, 6, 4, 7, 1, 1, 4, 0, 5, 0, 0, 8, 2,
                6, 5, 6, 6, 2, 2, 3, 3, 1, 1, 0, 7, 5, 5, 7, 3, 3, 6, 3, 7,
                9, 8, 0, 8, 6, 7, 7], dtype=int32),
PropertyArray([ 0, 1, 1, 13, 4, 5, 6, 7, 8, 9, 10, 4, 11, 0, 12,
                13, 10, 14, 15, 4, 16, 17, 18, 5, 19, 20, 21, 22, 23, 9,
                16, 14, 7, 24, 25, 26, 9, 27, 28, 29, 30, 5, 35, 14, 23,
                30, 11, 41, 31, 13, 32, 6, 25, 33, 8, 34, 0, 12, 4, 16,
                32, 35, 0, 28, 36, 13, 30, 27, 36, 11, 19, 13, 26, 13, 36,
                37, 23, 28, 32, 19, 25, 29, 5, 24, 20, 27, 25, 4, 17, 36,
                22, 11, 15, 12, 14, 2, 5, 38, 9, 9, 24, 39, 29, 13, 34,
                17, 8, 20, 9, 5, 23, 8, 9, 40, 40, 27, 31, 40, 41, 10,
                 3, 12, 25, 38, 20, 40, 9, 9, 25, 42, 10, 24, 43, 3, 37,
                 2, 17, 34, 35, 21, 38, 32, 26, 22, 28, 13, 17, 44, 45, 36,
                42, 26, 17, 27, 24, 40, 39, 9, 13, 5, 43, 38, 35, 30, 13,
                36, 13, 11, 14, 40, 40, 12, 3, 40, 38, 1, 40, 21, 42, 9,
                10, 29, 43, 45, 40, 31, 46, 40, 31, 5, 42, 40, 14, 11, 38,
                34, 31, 34, 40, 31, 31, 45, 10, 4], dtype=int32),
PropertyArray([ 0, 1, 2, ..., 163, 98, 18], dtype=int32)]

The solution I ended up using was:

vertex_name = nsbm.g.vertex_properties['_graphml_vertex_id']

clustering = [(nsbm.g.vertex_index[v], vertex_name[v],
nsbm.get_bs()[0][nsbm.g.vertex_index[v]]) for v in nsbm.g.vertices()]

clustering = [(i, name, base_clustering, nsbm.get_bs()[1][level0]) for i,
name, level0 in clustering]

clustering = [(i, name, level0, level1, nsbm.get_bs()[2][level1]) for i,
name, level0, level1 in clustering]

clustering = [(i, name, level0, level1, level2, nsbm.get_bs()[3][level2])
for i, name, level0, level1, level2 in clustering]

at which point I had my result. Is there a less verbose way of putting this?
If not, this serves as a feature request to add such a method, maybe called
"get_clabels" ?

Ni!

What you're looking for is the 'project_level' method of NestedBlockState:

some_level = 2
blocks = state.project_level( some_level ).get_blocks()
block_for_v_at_level = blocks[ some_vertex ]

Hope this helps,

ale
.~´

attachment.html (4.35 KB)

Thank you! I'll try that out.

attachment.html (5.13 KB)