def dm_dense_intra_padding(l1, dist_function, condensed=False):
"""Compute in a parallel way a distance matrix for a 1-d array.
Parameters
----------
l1, l2 : array_like
1-dimensional arrays. Compute the distance matrix for each couple of
elements of l1.
dist_function : function
Function to use for the distance computation.
Returns
-------
dist_matrix : array_like
Symmetric NxN distance matrix for each input_array element.
"""
def _internal(l1, n, idx, nprocs, shared_arr, dist_function):
for i in xrange(idx, n, nprocs):
if i % 2 == 0:
progressbar(i, n)
# shared_arr[i, i:] = [dist_function(l1[i], el2) for el2 in l2]
for j in xrange(i + 1, n):
shared_arr[idx, j] = dist_function(l1[i], l1[j])
# if shared_arr[idx, j] == 0:
# print l1[i].junction, '\n', l1[j].junction, '\n----------'
n = len(l1)
nprocs = min(mp.cpu_count(), n)
shared_array = np.frombuffer(mp.Array('d', n*n).get_obj()).reshape((n, n))
procs = []
try:
for idx in xrange(nprocs):
p = mp.Process(target=_internal,
args=(l1, n, idx, nprocs, shared_array,
dist_function))
p.start()
procs.append(p)
for p in procs:
p.join()
except (KeyboardInterrupt, SystemExit):
term_processes(procs, 'Exit signal received\n')
except BaseException as msg:
term_processes(procs, 'ERROR: %s\n' % msg)
progressbar(n, n)
dist_matrix = shared_array + shared_array.T
if condensed:
dist_matrix = scipy.spatial.distance.squareform(dist_matrix)
return dist_matrix
评论列表
文章目录