您可以使用np.unique(,return_inverse=1) 和np.add.at 来做到这一点
def comm_mtx(origin, dest, keys = None): # keys -> np.array of strings
if keys.size:
o_lbl = d_lbl = keys
k_sort = np.argsort(keys)
o_idx = np.searchsorted(keys, origin, sorter = k_sort)
d_idx = np.searchsorted(keys, dest, sorter = k_sort)
o_idx = np.arange(o_idx.size)[k_sort][o_idx]
d_idx = np.arange(d_idx.size)[k_sort][d_idx]
else:
o_lbl, o_idx = np.unique(origin, return_inverse = 1)
d_lbl, d_idx = np.unique(dest, return_inverse = 1)
out = np.zeros((o_lbl.size, d_lbl.size))
np.add.at(out, (o_idx, d_idx), 1)
if keys.size:
return out
else:
return o_lbl, d_lbl, out
根据out 的稀疏性,您可能希望改用scipy.sparse.coo_matrix
from scipy.sparse import coo_matrix as coo
def comm_mtx(origin, dest):
o_lbl, o_idx = np.unique(origin, return_inverse = 1)
d_lbl, d_idx = np.unique(dest, return_inverse = 1)
return o_lbl, d_lbl, coo((np.ones(origin.shape), (o_idx, d_idx)), shape = (o_lbl.size, d_lbl.size))