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

时间:2016-07-06 15:24:12

标签: python numpy

是否存在numpy函数来计算2D numpy数组中某个值的出现次数。 E.g。

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出现的次数?

3 个答案:

答案 0 :(得分:4)

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)

condition的值是一个布尔值列表,表示数组的每个元素是否满足条件。 np.count_nonzero计算数组中有多少非零元素。在布尔值的情况下,它计算具有True值的元素的数量。

为了能够处理浮点精度,你可以做这样的事情:

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

答案 1 :(得分:2)

对于浮点数组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

答案 2 :(得分: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

您也可以np.isclose()使用Imanol Luengo,具体取决于您的目标。但通常,知道值是否在范围比知道它们是否任意接近某个任意值更有用。

isclose的问题在于其默认容差值(rtolatol)是任意的,并且它生成的结果并不总是显而易见或易于预测。为了处理复杂的浮点运算,它进行even more浮点运算!简单的范围更容易推理。 (这是一个更一般的原则的表达:first, do the simplest thing that could possibly work。)

仍然,isclose及其堂兄allclose有其用途。我通常使用它们来查看整个数组是否与另一个整数数组非常相似,这似乎不是你的问题。