磨刀霍霍:Numpy中的bincount

开始学习~

关于 bincount

主要是用于统计数组中的各项数字的频次情况,并建立新的数列(类似于建立直方图)。
这样建立了数据的映射情况,因此还能反向还原数组本身。

朴素的用法

  • numpy.bincount(array)
  • bin数量是要比数组 x 中的最大值1
  • 每个 bin 都给出了索引值在数组 x 中出现的次数
# 假设数组 x
x = numpy.array([1,3,4,5,7,7])
# bin = 7 + 1 = 8
numpy.bincount(x)
# 仅 7 出现了 2 次
# 输出 [0,1,0,1,1,1,0,2]

带上参数 weights 的用法

  • numpy.bincount(array,weights)
  • 一旦 weights 被指定,则数组 x 会被加权
# 假设数组 x
x = numpy.array([1,3,3,4])
# 假设权重 w
w = numpy.array([2,4,5,7,8,9])
# bin = 4 + 1 = 5
numpy.bincount(x,w)
# 索引 0 - > 0 --> w[0] = 2
# 索引 1 - > 1 --> w[1] = 4
# 索引 2 - > 0 --> w[0] = 2
# 索引 3 - > 2 --> w[2] = 5
# 索引 4 - > 1 --> w[1] = 4
# 输出 [2,4,1,5,4]

带上参数 minlength 的用法

  • numpy.bincount(array,minlength)
  • 如果 minlength 被指定,那么输出数组中 bin 的数量至少为它指定的数
  • bin ≥ minlength
# 假设数组 x
x = numpy.array([1,3,3,4])
# 原本 bin = 4 + 1 = 5
numpy.bincount(x,minlength = 7)
# bin 因为 minlength 的存在变成了 7
# 输出 [0,1,0,2,1,0,0]
numpy.bincount(x,minlength = 1)
# minlength 小于 bin 原有值 5 ,所以参数失效
# 输出[0,1,0,2,1]

练习题

# 根据索引列表 I ,对数值列表 X 进行累加,得到 F
X = [1,2,3,4,5,6]
I = [1,3,9,3,4,1]
F = np.bincount(I,X)
print(F)
# 给定一个数值向量,和一个索引向量,根据后者的索引,在前者对应位置加 1 (注意重复索引)
Z = np.ones(10)
I = np.random.randint(0,len(Z),20)
Z_new = Z + np.bincount(I, minlength = len(Z))
# 给定向量D,根据索引数组 S 得到子集,计算子集上的均值
D = np.random.uniform(0,1,100)
S = np.random.randint(0,10,100)
D_sums = np.bincount(S, weights = D)
D_counts = np.bincount(S)
D_means = D_sums / D_counts
print(D_means)

参考资料

  1. Python—numpy.bincount()