我需要在多个一维数组中找到重复数字及其重复次数。对于一维数组,可以使用np.unique函数实现,但似乎并不适用于二维数组。我已经搜索了类似的答案,但我需要更详细的报告(包括所有数字出现的次数和位置索引)。
numpy中的bincount能用于二维数组吗?
这个回答不太符合我的要求,我希望得到一个包含更多数据信息的映射,比如最多出现的数字等。我不喜欢循环嵌套,虽然这可能不太恰当,但我会尝试寻找不使用循环的方法,因为我对速度有非常苛刻的要求。
例如:
因为这是循环的一部分,所以你需要一种有效的方式来矢量化以一次完成更多的统计行,并尝试避免再次循环。
我使用了数据包聚合来计算结果。该函数通过构造区分行的key1,数据本身作为key2,和一个二维数组的所有1来实现。虽然能够输出,但我认为这只是临时措施。需要找到正确的方法。
例如:
a = np.array([[1,2,2,2,3],
[0,1,1,1,2],
[0,0,0,1,0]])
# The number of occurrences for each number
# int count
# 0. 0
# 1. 1
# 2. 3
# 3. 1
#need the output:
#Index = the number of statistics, the number of repetitions
[[0 1 3 1]
[1 3 1 0]
[4 1 0 0]]
因为这是循环的一部分,所以你需要一种有效的方式来矢量化以一次完成更多的统计行,并尝试避免再次循环。
我使用了数据包聚合来计算结果。该函数通过构造区分行的key1,数据本身作为key2,和一个二维数组的所有1来实现。虽然能够输出,但我认为这只是临时措施。需要找到正确的方法。
from numpy_indexed import group_by
def unique2d(x):
x = x.astype(int); mx = np.nanmax(x)+1
ltbe = np.tile(np.arange(x.shape[0])[:,None],(1,x.shape[1]))
vtbe = np.zeros(x.shape).astype(int) + 1
groups = npi.group_by((ltbe.ravel(),x.ravel().astype(int)))
unique, median = groups.sum(vtbe.ravel())
ctbe = np.zeros(x.shape[0]*mx.astype(int)).astype(int)
ctbe[(unique[0] * mx + unique[1]).astype(int)] = median
ctbe.shape=(x.shape[0],mx)
return ctbe
unique2d(a)
>array([[0, 1, 3, 1],
[1, 3, 1, 0],
[4, 1, 0, 0]])
希望有好的建议和算法,谢谢。
np.bincount
,但目前还没有实现(请参见问题#8495和#9397)。如链接问题中所建议的,您可以暂时使用apply_along_axis
。 - jdehesa