python - 向量化计数二维 Numpy 数组

标签 python arrays numpy

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

示例: 我有两个 numpy 数组,起点和终点。出发地和目的地可以具有相同的值。假设我的数组中有 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_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))

关于python - 向量化计数二维 Numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45457640/

相关文章:

java - 将 ImageByteArray 转换为 BufferedImage

c# - 从数据表获取字节数组到列表 C#

python - 乘以 numpy 中包含图像的张量

python - 填充数组中按行、列索引偏移的对角线和反对角线 - NumPy/Python

python - 打乱 2D numpy 数组中的位置列表,然后使用它在 3D numpy 数组中进行选择(或切片)

python - 从C向Python程序发送字符串

Python 默认参数和参数名称

python - pycharm或其他产品有没有类似gitlens的插件?

python - 使用 Python 解析 .pcap 文件中的 SSL 流量

javascript - 在 true 或 false 中相等数量的值之间排序的函数