是否存在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
出现的次数?
答案 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
的问题在于其默认容差值(rtol
和atol
)是任意的,并且它生成的结果并不总是显而易见或易于预测。为了处理复杂的浮点运算,它进行even more浮点运算!简单的范围更容易推理。 (这是一个更一般的原则的表达:first, do the simplest thing that could possibly work。)
仍然,isclose
及其堂兄allclose
有其用途。我通常使用它们来查看整个数组是否与另一个整数数组非常相似,这似乎不是你的问题。