Skip to content

Commit 1979185

Browse files
committed
Speed up connect_edges
1 parent 3171d88 commit 1979185

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

datashader/bundling.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,27 @@ def accumulate(img, point, accuracy):
280280
img[int(point[0] * accuracy), int(point[1] * accuracy)] += point[2]
281281

282282

283+
@ngjit
284+
def _edge_val_to_segments(vals):
285+
edge_vals = np.full(vals.size * 3, np.nan, np.dtype("float"))
286+
for i in nb.prange(len(vals)):
287+
pos = int(i * 3)
288+
edge_vals[pos:pos+2] = vals[i]
289+
return edge_vals
290+
291+
@ngjit
292+
def _format_graph_segments(nodes, edges):
293+
edge_table = np.full((edges.shape[0] * 3, 2), np.nan)
294+
for i in nb.prange(edges.shape[0]):
295+
pos = int(i * 3)
296+
s, t = edges[i]
297+
edge_table[pos , 0] = nodes[s, 0]
298+
edge_table[pos , 1] = nodes[s, 1]
299+
edge_table[pos+1, 0] = nodes[t, 0]
300+
edge_table[pos+1, 1] = nodes[t, 1]
301+
return edge_table
302+
303+
283304
def _convert_graph_to_edge_segments(nodes, edges, params):
284305
"""
285306
Merge graph dataframes into a list of edge segments.
@@ -388,8 +409,17 @@ def __call__(self, nodes, edges, **params):
388409
a point with NaN as the x or y value.
389410
"""
390411
p = param.ParamOverrides(self, params)
391-
edges, segment_class = _convert_graph_to_edge_segments(nodes, edges, p)
392-
return _convert_edge_segments_to_dataframe(edges, segment_class, p)
412+
e = pd.DataFrame(
413+
_format_graph_segments(
414+
nodes[[p.x, p.y]].values,
415+
edges[[p.source, p.target]].values),
416+
columns=[p.x, p.y]
417+
)
418+
if p.weight is not None:
419+
e[p.weight] = _edge_val_to_segments(edges[p.weight].values)
420+
if p.include_edge_id:
421+
e["edge_id"] = _edge_val_to_segments(edges["id"])
422+
return e
393423

394424
directly_connect_edges = connect_edges # For bockwards compatibility; deprecated
395425

0 commit comments

Comments
 (0)