Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何提高布尔运算的速度_Python_Numpy_Optimization_Boolean - Fatal编程技术网

Python 如何提高布尔运算的速度

Python 如何提高布尔运算的速度,python,numpy,optimization,boolean,Python,Numpy,Optimization,Boolean,如果我有一个非常大的数据块,我想找出一些特定的元素,并将它们从bool转换为number。例如,我想确定元素是否在间隔0.3,0.4内,并将True转换为1,将False转换为0 j=0.3是的,表达式的作用相同。核对一下 jmult = ((0.3<i)*(i<0.4))*1 jand = ((0.3<i)&(i<0.4))*1 jand == jmult 是的,这个表达方式是一样的。核对一下 jmult = ((0.3<i)*(i<0.4))*

如果我有一个非常大的数据块,我想找出一些特定的元素,并将它们从bool转换为number。例如,我想确定元素是否在间隔0.3,0.4内,并将True转换为1,将False转换为0


j=0.3是的,表达式的作用相同。核对一下

jmult = ((0.3<i)*(i<0.4))*1
jand  = ((0.3<i)&(i<0.4))*1
jand == jmult

是的,这个表达方式是一样的。核对一下

jmult = ((0.3<i)*(i<0.4))*1
jand  = ((0.3<i)&(i<0.4))*1
jand == jmult
是,对于布尔数组,&和*是相同的,因为只有当两个操作数都为True时,这两个值才为True,否则为False

您已经发现,每个操作都会创建一个临时数组,尽管较新的NumPy版本可能会在这方面进行优化,因此每个操作都有一个临时布尔数组Yes,对于布尔数组,&和*是相同的,因为只有当两个操作数都为True时,它们才为True,否则为False


您已经发现,每个操作都会创建一个临时数组,尽管较新的NumPy版本可能会在这方面进行优化,因此每个操作都有一个临时布尔数组。如果您想知道它是否以相同的方式工作,请不要问我们:问Python。运行一组测试。毕竟,Python运行时系统是最终的权威,我们不是一个测试服务?你总是可以写一个C-扩展来有效地使用内存…C-扩展?我能控制内存的使用量吗?如果你想知道它是否以同样的方式工作,不要问我们:问Python。运行一组测试。毕竟,Python运行时系统是最终的权威,我们不是一个测试服务?你总是可以写一个C-扩展来有效地使用内存…C-扩展?我能控制内存的使用量吗?哇!你用的是NumPy,不是Python。不,这对你没用。哎呀!你用的是NumPy,不是Python。不,这对你不起作用。如果我做j=iIt会更有效吗?效率可能会更低,因为你有5个临时数组,其中3个是整数,比布尔占用更多的空间。但是,您需要对其计时或使用内存探查器来找出哪些优化对您的系统起作用。Numba和cython更像Python->C转换器,据我所知,它们都能够使用硬件矢量化,但您需要自己编写循环代码。另一方面,Numexpr只是一个不同的、更优化的并行后端,用于NumPy操作,因此默认情况下它使用矢量化和广播。如果我使用j=iIt,效率会更高吗?可能效率会更低,因为当时有5个临时数组,其中3个是整数,比布尔占用更多空间。但是,您需要对其计时或使用内存探查器来找出哪些优化对您的系统起作用。Numba和cython更像Python->C转换器,据我所知,它们都能够使用硬件矢量化,但您需要自己编写循环代码。另一方面,Numexpr只是一个不同的、更优化和并行的NumPy操作后端,因此默认情况下它使用矢量化和广播。
import numba as nb
import numpy as np

@nb.njit
def numba_func(arr, lower, upper):
    res = np.zeros(arr.size, dtype=np.int8)
    arr_raveled = arr.ravel()
    for idx in range(arr.size):
        res[idx] = lower < arr_raveled[idx] < upper
    return res.reshape(arr.shape)

>>> numba_func(i, 0.3, 0.4)  # sample call
import numexpr as ne

ne.evaluate('((0.3<i)&(i<0.4))*1')
%load_ext cython

%%cython

import numpy as np
cimport numpy as cnp

cpdef cnp.int8_t[:] cython_func(double[:] arr, double lower, double upper):
    cdef Py_ssize_t idx
    cdef cnp.int8_t[:] res = np.empty(len(arr), dtype=np.int8)
    for idx in range(len(arr)):
        res[idx] = lower < arr[idx] < upper
    return res
np.asarray(cython_func(i.ravel(), 0.3, 0.4)).reshape(i.shape)  # sample call
i = np.random.random((1000, 1000, 10))

%timeit numba_func(i, 0.3, 0.4)
52.1 ms ± 3.08 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit ne.evaluate('((0.3<i)&(i<0.4))*1')
77.1 ms ± 6.59 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit np.asarray(cython_func(i.ravel(), 0.3, 0.4)).reshape(i.shape)
146 ms ± 3.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit ((0.3<i)&(i<0.4))*1
180 ms ± 2.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)