任何人都可以帮我向我解释如何在没有任何迭代的情况下从2个数组中进行计数(例如使用numpy)?
实施例: 我有两个numpy数组,Origin和destiation。原点和目的地可以具有相同的值。假设我的数组中有6个项目
origin = np.array(['LA', 'SF', 'NY', 'NY', 'LA', 'LA'])
dest = np.array(['SF', 'NY', 'NY', 'SF', 'LA', 'LA'])
第一项是来自LA-SF,第二项SF-NY,第三项纽约 - 纽约,等等。
我想要的结果是
array([[1, 0, 1],
[0, 2, 1],
[1, 0, 0]])
其中行指的是原点,首先是NY,第二行是LA,第三行是SF,列指的是具有相同顺序的目的地。
谢谢!
答案 0 :(得分:1)
您可以使用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))
答案 1 :(得分:0)
要实现您所要求的,即输出矩阵的行与特定顺序的键对应,您可以使用字典将每个唯一元素映射到行索引。
origin = np.asarray(['LA', 'SF', 'NY', 'NY', 'LA', 'LA'])
dest = np.asarray(['SF', 'NY', 'NY', 'SF', 'LA', 'LA'])
matrix_map = {'NY': 0, 'LA': 1, 'SF': 2}
stacked_inputs = np.vstack((origin, dest))
remapped_inputs = np.vectorize(matrix_map.get)(stacked_inputs)
output_matrix = np.zeros((len(matrix_map), len(matrix_map)), dtype=np.int16)
np.add.at(output_matrix, (remapped_inputs[0], remapped_inputs[1]), 1)
print(output_matrix)
哪些输出;
[[1 0 1]
[0 2 1]
[1 0 0]]
根据需要。
或者,如果您不希望事先对matrix_map
进行硬编码,则可以按照以下方式以编程方式构建它;
stacked_inputs = np.vstack((origin, dest))
matrix_map = {}
for element in stacked_inputs.flatten():
matrix_map.setdefault(element, len(matrix_map))
print(matrix_map)
remapped_inputs = np.vectorize(matrix_map.get)(stacked_inputs)
这不会为您提供所需的顺序,但允许您使用字典轻松映射哪个行/列与哪个标记相关。