def source_to_target_distances(sourceIDs, targetIDs, points, segmentIDs=[], excludeIDs=[-1]): """ Create a Euclidean distance matrix between source and target points. Compute the Euclidean distance from each source point to its nearest target point, optionally within each segment. Example:: Compute fundus-to-feature distances, the minimum distance from each label boundary vertex (corresponding to a fundus in the DKT cortical labeling protocol) to all of the feature vertices in the same fold. Parameters ---------- sourceIDs : list of N integers (N is the number of vertices) source IDs, where any ID not in excludeIDs is a source point targetIDs : list of N integers (N is the number of vertices) target IDs, where any ID not in excludeIDs is a target point points : list of N lists of three floats (N is the number of vertices) coordinates of all vertices segmentIDs : list of N integers (N is the number of vertices) segment IDs, where each ID not in excludeIDs is considered a different segment (unlike above, where value in sourceIDs or targetIDs doesn't matter, so long as its not in excludeIDs); source/target distances are computed within each segment excludeIDs : list of integers IDs to exclude Returns ------- distances : numpy array distance value for each vertex (default -1) distance_matrix : numpy array [#points by maximum segment ID + 1] distances organized by segments (columns) """ import numpy as np from mindboggle.guts.compute import point_distance if isinstance(points, list): points = np.asarray(points) npoints = len(points) # Extract unique segment IDs (or use all points as a single segment): if np.size(segmentIDs): segments = [x for x in np.unique(segmentIDs) if x not in excludeIDs] else: segmentIDs = np.zeros(npoints) segments = [0] nsegments = max(segments) + 1 # Initialize outputs: distances = -1 * np.ones(npoints) distance_matrix = -1 * np.ones((npoints, nsegments)) # For each segment: for segment in segments: segment_indices = [i for i, x in enumerate(segmentIDs) if x == segment] # Find all source points in the segment: source_indices = [ i for i, x in enumerate(sourceIDs) if x not in excludeIDs if i in segment_indices ] # Find all target points in the segment: target_indices = [ i for i, x in enumerate(targetIDs) if x not in excludeIDs if i in segment_indices ] if source_indices and target_indices: # For each source point in the segment: for isource in source_indices: # Find the closest target point: d, i = point_distance(points[isource], points[target_indices]) distances[isource] = d distance_matrix[isource, segment] = d return distances, distance_matrix
def source_to_target_distances(sourceIDs, targetIDs, points, segmentIDs=[], excludeIDs=[-1]): """ Create a Euclidean distance matrix between source and target points. Compute the Euclidean distance from each source point to its nearest target point, optionally within each segment. Example:: Compute fundus-to-feature distances, the minimum distance from each label boundary vertex (corresponding to a fundus in the DKT cortical labeling protocol) to all of the feature vertices in the same fold. Parameters ---------- sourceIDs : list of N integers (N is the number of vertices) source IDs, where any ID not in excludeIDs is a source point targetIDs : list of N integers (N is the number of vertices) target IDs, where any ID not in excludeIDs is a target point points : list of N lists of three floats (N is the number of vertices) coordinates of all vertices segmentIDs : list of N integers (N is the number of vertices) segment IDs, where each ID not in excludeIDs is considered a different segment (unlike above, where value in sourceIDs or targetIDs doesn't matter, so long as its not in excludeIDs); source/target distances are computed within each segment excludeIDs : list of integers IDs to exclude Returns ------- distances : numpy array distance value for each vertex (default -1) distance_matrix : numpy array [#points by maximum segment ID + 1] distances organized by segments (columns) """ import numpy as np from mindboggle.guts.compute import point_distance if isinstance(points, list): points = np.asarray(points) npoints = len(points) # Extract unique segment IDs (or use all points as a single segment): if np.size(segmentIDs): segments = [x for x in np.unique(segmentIDs) if x not in excludeIDs] else: segmentIDs = np.zeros(npoints) segments = [0] nsegments = max(segments) + 1 # Initialize outputs: distances = -1 * np.ones(npoints) distance_matrix = -1 * np.ones((npoints, nsegments)) # For each segment: for segment in segments: segment_indices = [i for i,x in enumerate(segmentIDs) if x == segment] # Find all source points in the segment: source_indices = [i for i,x in enumerate(sourceIDs) if x not in excludeIDs if i in segment_indices] # Find all target points in the segment: target_indices = [i for i,x in enumerate(targetIDs) if x not in excludeIDs if i in segment_indices] if source_indices and target_indices: # For each source point in the segment: for isource in source_indices: # Find the closest target point: d, i = point_distance(points[isource], points[target_indices]) distances[isource] = d distance_matrix[isource, segment] = d return distances, distance_matrix