Python 矢量化计数二维Numpy阵列

Python 矢量化计数二维Numpy阵列,python,arrays,numpy,Python,Arrays,Numpy,有人能帮我解释一下,我如何在不进行任何迭代的情况下从2个数组进行计数(例如使用numpy) 例如: 我有两个numpy数组,Origin和destination。原点和目标可以具有相同的值。假设我的数组中有6项 origin = np.array(['LA', 'SF', 'NY', 'NY', 'LA', 'LA']) dest = np.array(['SF', 'NY', 'NY', 'SF', 'LA', 'LA']) 第一项来自洛杉矶旧金山,第二项来自旧金山纽约,第三项来自纽约,依

有人能帮我解释一下,我如何在不进行任何迭代的情况下从2个数组进行计数(例如使用numpy)

例如: 我有两个numpy数组,Origin和destination。原点和目标可以具有相同的值。假设我的数组中有6项

origin = np.array(['LA', 'SF', 'NY', 'NY', 'LA', 'LA'])

dest = np.array(['SF', 'NY', 'NY', 'SF', 'LA', 'LA'])
第一项来自洛杉矶旧金山,第二项来自旧金山纽约,第三项来自纽约,依此类推

我想要的结果是

array([[1, 0, 1],
       [0, 2, 1],
       [1, 0, 0]])
其中,行表示原点,第一个为NY,第二个为LA,第三个为SF,列表示顺序相同的目的地


谢谢大家!

您可以使用
np.unique(,return\u 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_矩阵

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))

为了实现您所要求的,即以特定的顺序将输出矩阵中的行与键对应,您可以使用字典将每个唯一元素映射到行索引

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\u 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)

这不会给您提供所需的顺序,但允许您使用字典轻松映射与哪个令牌相关的行/列。

这个答案是错误的,因为OP说“其中行指的是原点,第一个是NY,第二个是LA,第三个是SF,而列指的是具有相同顺序的目的地”,而且,
np.unique
不会给你这个命令。虽然如果OP改变主意,决定他实际上不需要这个,那么这个答案是正确的,而且比我的更好:)非常正确,让我看看我是否能想出比你更好的方法:请这样做,我相信有比使用字典映射键更好的方法。还有,用稀疏矩阵喊得好!稀疏矩阵的想法真的很酷。我决定接受这个答案,因为订单对我来说并不重要。非常感谢。