如何利用Numpy生成统计数组X、Y元素组合出现次数的矩阵?
嘿,这个问题问得相当到位!Numpy确实有专门用来生成这种基于(X,Y)元组出现频次矩阵的工具,最顺手的就是numpy.histogram2d函数,当然也有其他实现方式,我会结合你的示例一步步讲清楚怎么优雅搞定。
1. Numpy中生成这类矩阵的核心工具
你要的其实就是二维频次直方图,Numpy的numpy.histogram2d正好干这个事儿——它会统计所有(x,y)元组的出现次数,并把结果整理成矩阵形式,完全匹配你的需求。
2. 针对你的示例生成目标矩阵
先来看你的输入数据,我们直接用代码一步步实现:
首先导入Numpy并定义你的数组:
import numpy as np x = np.array([1, 1, 2, 2, 3, 3, 1, 2, 3]) y = np.array([0, 1, 3, 2, 1, 0, 2, 1, 1])
接下来用histogram2d计算频次矩阵:
# 指定bins的范围:X的取值范围是0-3(对应矩阵4行),Y的取值范围是0-3(对应矩阵4列) counts, _, _ = np.histogram2d(x, y, bins=[np.arange(0, 5), np.arange(0, 5)]) # 转换为整数类型,得到最终矩阵 matrix = counts.astype(int)
运行这段代码后,matrix就是你要的结果:
array([[0, 0, 0, 0], [1, 1, 1, 0], [0, 1, 1, 1], [1, 2, 0, 0]])
另一种实现思路(用numpy.unique)
如果想更直观地处理元组对,也可以用numpy.unique统计唯一元组的频次,再填充到空矩阵里:
# 把x和y组合成二维的元组对数组 xy_pairs = np.stack((x, y), axis=1) # 获取唯一元组和对应的频次 unique_pairs, counts = np.unique(xy_pairs, axis=0, return_counts=True) # 创建空矩阵,维度对应X和Y的最大取值+1 matrix = np.zeros((4, 4), dtype=int) # 把频次填充到对应位置 matrix[unique_pairs[:, 0], unique_pairs[:, 1]] = counts
这个方法也能得到完全一样的结果,不过histogram2d更一步到位,适合这种标准的二维频次统计场景。
为什么这么做能匹配你的需求?
histogram2d的第一个参数是X数组,第二个是Y数组,返回的counts矩阵的行对应X的取值,列对应Y的取值,正好符合你的要求。- 我们指定的
bins=[np.arange(0,5), np.arange(0,5)]是为了让矩阵索引和X、Y的实际取值完全对应(比如X=1对应矩阵第1行,Y=2对应矩阵第2列),这样X=0的行自然全为0,完美匹配你给出的目标矩阵。
内容的提问来源于stack exchange,提问作者Felipe Endlich
相关产品推荐
相关产品推荐

