我正在做一个练习,需要根据 3x3 矩阵中的出现情况将 0 到 5 之间的值组织到一个数组中。我正在使用 NumPy 来完成此任务。
给定以下 3x3 矩阵:
[[1 1 3]
[4 5 2]
[3 0 0]]
我想输出一个数组,其中每个元素代表从 0 到 5 的每个值出现的次数。对于上述矩阵,所需的输出是:
[2,2,1,2,1,1]
我尝试过使用 np.array() 和 np.asarray(),并且我考虑过使用 flatten() 函数,但它并没有帮助我实现目标。这是我尝试过的:
import numpy as np
m = np.matrix([[1,1,3], [4,5,2], [3,0,0]]) # Primary matrix, used for obtaining the values
print("Original Matrix: ") # Print original matrix
print(m)
print("Occurrences: ")
for i in range(6):
occur = (np.count_nonzero(m == i)) # Count the number of elements satisfying the condition
print(i, ":", occur)
尽管如此,我的输出是:
Occurrences:
0 : 2
1 : 2
2 : 1
3 : 2
4 : 1
5 : 1
如何使用 NumPy 有效地将这些计数组织到所需的输出数组中?
可以使用
numpy.bincount
来实现这一点。
bincount
函数计算数组中每个值的出现次数,这正是想要的。
以下是如何使用它的方法:
import numpy as np
m = np.matrix([[1, 1, 3],
[4, 5, 2],
[3, 0, 0]])
occurrences = np.bincount(m.flatten(), minlength=6)
print(occurrences)
这将打印:
[2 2 1 2 1 1]
解释:
-
m.flatten()
:这会将的矩阵展平为一个包含所有值的单个数组:[1 1 3 4 5 2 3 0 0]
。 -
np.bincount(m.flatten(), minlength=6)
: 这将计算展平数组中每个值的出现次数。minlength=6
参数确保即使某些数字(0 到 5)不存在于矩阵中,输出数组也包含 6 个元素。
此方法避免了显式循环,并且比使用
np.count_nonzero
进行迭代更有效,尤其是对于大型矩阵而言。