【发布时间】:2017-08-13 13:36:48
【问题描述】:
假设我有两个 NumPy 矩阵(或 Pandas DataFrames,尽管我猜这在 NumPy 中会更快)。
>>> arr1
array([[3, 1, 4],
[4, 3, 5],
[6, 5, 4],
[6, 5, 4],
[3, 1, 4]])
>>> arr2
array([[3, 1, 4],
[8, 5, 4],
[3, 1, 4],
[6, 5, 4],
[3, 1, 4]])
对于arr1 中的每个行向量,我想计算arr2 中该行向量的出现次数并生成这些计数的向量。所以对于这个例子,结果将是
[3, 0, 1, 1, 3]
什么是有效的方法?
第一种方法:
仅使用循环 arr1 的行向量并在 arr2 上生成相应的布尔向量的明显方法似乎非常慢。
np.apply_along_axis(lambda x: (x == arr2).all(1).sum(), axis=1, arr=arr1)
这似乎是一个糟糕的算法,因为我必须多次检查相同的行。
第二种方法:我可以将行数存储在 collections.Counter 中,然后使用 apply_along_axis 访问它。
cnter = Counter(tuple(row) for row in arr2)
np.apply_along_axis(lambda x: cnter[tuple(x)], axis=1, arr=arr1)
这似乎有点快,但我觉得仍然必须有比这更直接的方法。
【问题讨论】:
标签: python performance pandas numpy matrix