测试numpy数组中的每个元素是否位于两个值之间的简单方法?

9rnv2umw  于 2023-03-18  发布在  其他
关注(0)|答案(5)|浏览(210)

我想知道是否有一种语法上简单的方法来检查numpy数组中的每个元素是否位于两个数字之间。
换句话说,就像numpy.array([1,2,3,4,5]) < 5将返回array([True, True, True, True, False])一样,我想知道是否有可能做类似于下面这样的事情:
......以获得......

array([False, True, True, True, False])

我知道我可以通过布尔测试的逻辑链接来获得这个,但是我正在处理一些相当复杂的代码,我正在寻找一个语法上干净的解决方案。
有什么建议吗?

2wnc66cl

2wnc66cl1#

一种解决办法是:

import numpy as np
a = np.array([1, 2, 3, 4, 5])
(a > 1) & (a < 5)  # 1 < element < 5?
# array([False,  True,  True,  True, False])
inb24sb2

inb24sb22#

另一种方法是使用numpy.any,下面是一个示例

import numpy as np
a = np.array([1,2,3,4,5])
np.any((a < 1)|(a > 5 ))
vulvrdjw

vulvrdjw3#

也可以将矩阵居中并使用到0的距离

upper_limit = 5
lower_limit = 1
a = np.array([1,2,3,4,5])
your_mask = np.abs(a- 0.5*(upper_limit+lower_limit))<0.5*(upper_limit-lower_limit)

需要记住的一点是,比较在两端是对称的,因此它可以执行1<x<51<=x<=5,但不能执行1<=x<5

00jrzges

00jrzges4#

在多维数组中,可以使用建议的np.any()选项或比较运算符,而使用&and将引发错误。

使用比较运算符的示例(在多维数组上)

import numpy as np

arr = np.array([[1,5,1],
                [0,1,0],
                [0,0,0],
                [2,2,2]])

现在,如果你想检查数组值是否在一个范围内,例如A〈arr〈B,使用==;如果你想检查数组值是否在一个范围外,例如arr〈A and arr〉B,使用!=

(arr<1) != (arr>3)
> array([[False,  True, False],
         [ True, False,  True],
         [ True,  True,  True],
         [False, False, False]])

(arr>1) == (arr<4)
> array([[False, False, False],
         [False, False, False],
         [False, False, False],
         [ True,  True,  True]])
yqhsw0fo

yqhsw0fo5#

将基于NumPy的方法与Numba加速的循环进行比较是很有趣的:

import numpy as np
import numba as nb

def between(arr, a, b):
    return (arr > a) & (arr < b)

@nb.njit(fastmath=True)
def between_nb(arr, a, b):
    shape = arr.shape
    arr = arr.ravel()
    n = arr.size
    result = np.empty_like(arr, dtype=np.bool_)
    for i in range(n):
        result[i] = arr[i] > a or arr[i] < b
    return result.reshape(shape)

基准的计算和绘制:
x一个一个一个一个x一个一个二个x
导致:

表明(在我的测试条件下):

  • 对于更大和更小的输入,Numba方法可以提高20%的速度
  • 对于中等大小的输入,NumPy方法通常更快

相关问题