Numpy在2D数组中查找数字出现的次数

4
有没有一个numpy函数可以计算2D numpy数组中某个值出现的次数。例如:
np.random.random((3,3))

array([[ 0.68878371,  0.2511641 ,  0.05677177],
       [ 0.97784099,  0.96051717,  0.83723156],
       [ 0.49460617,  0.24623311,  0.86396798]])

我该如何查找此数组中出现0.83723156的次数?

4个回答

7
arr = np.random.random((3,3))
# find the number of elements that get really close to 1.0
condition = arr == 0.83723156
# count the elements
np.count_nonzero(condition)
< p> condition 值是一个布尔值列表,表示数组的每个元素是否满足条件。 np.count_nonzero 计算数组中非零元素的数量。 对于布尔值,它计算具有True值的元素的数量。

为了能够处理浮点精度问题,您可以尝试使用以下方法:

condition = np.fabs(arr - 0.83723156) < 0.001

3

对于浮点数数组,np.isclose比直接比较相同元素或定义自定义范围更好。

>>> a = np.array([[ 0.68878371,  0.2511641 ,  0.05677177],
                  [ 0.97784099,  0.96051717,  0.83723156],
                  [ 0.49460617,  0.24623311,  0.86396798]])

>>> np.isclose(a, 0.83723156).sum()
1

请注意,在计算机中实数并不能被精确地表示,这就是为什么np.isclose能够工作而==不能的原因。
>>> (0.1 + 0.2) == 0.3
False

相反:

>>> np.isclose(0.1 + 0.2, 0.3)
True

我认为这并不是比定义范围更好的选择。isclose 提供的默认容差值(rtolatol)是任意的,而且它生成的结果并不总是明显或易于预测 -- 为了处理复杂的浮点运算,它甚至进行了更多的浮点运算。一个简单的范围更容易精确地推理。尽管如此,我同意 isclose 有时是一个有用的替代方案,所以我从我的答案中链接到了你的答案。 - senderle

0

要计算任何数组中出现x的次数,您可以简单地对由a == x产生的布尔数组求和:

>>> col = numpy.arange(3)
>>> cols = numpy.tile(col, 3)
>>> (cols == 1).sum()
3

不用说,但我还是要说:如果您没有指定范围,这对浮点数没有什么用处:

>>> a = numpy.random.random((3, 3))
>>> ((a > 0.5) & (a < 0.75)).sum()
2

这个通用原则适用于各种测试。例如,如果您想计算整数浮点值的数量:

>>> a = numpy.random.random((3, 3)) * 10
>>> a
array([[ 7.33955747,  0.89195947,  4.70725211],
       [ 6.63686955,  5.98693505,  4.47567936],
       [ 1.36965745,  5.01869306,  5.89245242]])
>>> a.astype(int)
array([[7, 0, 4],
       [6, 5, 4],
       [1, 5, 5]])
>>> (a == a.astype(int)).sum()
0
>>> a[1, 1] = 8
>>> (a == a.astype(int)).sum()
1

你也可以像Imanol Luengo所描述的那样使用np.isclose(),具体取决于你的目标是什么。但通常,知道值是否在一个范围内比知道它们是否任意接近某个任意值更有用。

isclose的问题在于其默认公差值(rtolatol)是任意的,并且它生成的结果并不总是明显或易于预测的。为了处理复杂的浮点运算,它甚至进行更多的浮点运算!一个简单的范围更容易精确地推理。(这是一个更一般的原则的表达:首先,做可能起作用的最简单的事情。)

不过,isclose和它的表亲allclose也有它们的用途。我通常使用它们来判断一个整个数组是否与另一个整个数组非常相似,这似乎不是你的问题。


谢谢@senderle,如果与浮点数-100.0进行比较,例如小数点后只有一个0,该怎么办? - user308827

0
如果有人需要的话:对于非常大的二维数组,如果您想计算整个数组中所有元素出现的次数,可以将数组展平为列表,然后计算每个元素出现的次数。
from itertools import chain
import collections
from collections import Counter

#large array is called arr
flatten_arr = list(chain.from_iterable(arr))
dico_nodeid_appearence = Counter(flatten_arr)
#how may times x appeared in the arr
dico_nodeid_appearence[x]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接