Python 基于条件对数组值进行舍入的快速方法

Python 基于条件对数组值进行舍入的快速方法,python,performance,numpy,vectorization,Python,Performance,Numpy,Vectorization,我有这样一个数组: a = np.array([ [0.02, 1.01, 4.01, 3.00, 5.12], [2.11, 1.50, 3.98, 0.52, 5.01]]) 和“条件”数组: 如果c[k]-const

我有这样一个数组:

a = np.array([
     [0.02, 1.01, 4.01, 3.00, 5.12],
     [2.11, 1.50, 3.98, 0.52, 5.01]])
和“条件”数组:

如果
c[k]-const
,我想将
a[I][j]=c[k]
四舍五入,否则
a[I][j]=0

例如,如果
const=0.05
。结果可能是:

a_result = [[0 1 4 0 0]
            [0 0 4 0 5]]
navie的方法是使用3 for循环检查每个
a[i][j]
c[k]
。但是,当
a
很大时,速度非常慢。我们是否有一种快速的“python方式”来实现这一点

对于循环(慢速)解决方案:

a_result = np.full(a.shape, 0)    
const = 0.05     
mh, mw = a.shape
for i in range(mh-1):
   for j in range(mw-1):
      for k in range(1, len(c)):
                if a[i][j] > (c[k] - const) and a[i][j] < (c[k] + const): 
                    a_result[i][j] = c[k] 
a_result=np.full(a.shape,0)
常数=0.05
mh,mw=a.形状
对于范围内的i(mh-1):
对于范围内的j(mw-1):
对于范围(1,len(c))中的k:
如果a[i][j]>(c[k]-常数)和a[i][j]<(c[k]+常数):
a_结果[i][j]=c[k]
方法#1

一种矢量化方法是使用-


检查Python的
map
操作符;我认为NumPy有一个更容易应用于数组的方法。我刚刚更新了question@Divakar。当
a.shape=(2,5)
c.size=4
时,如何理解
a[I][j]=c[k]
的每一个元素与
c
的每一个元素相比较。这为它们带来了单独的迭代器。@Divakar OK。通过使用
a[i,j]
而不是
a[i][j]
,可以稍微加快循环代码的速度。要获得引人注目且仍然简单的结果,您可能需要查看Numba:
a_result = np.full(a.shape, 0)    
const = 0.05     
mh, mw = a.shape
for i in range(mh-1):
   for j in range(mw-1):
      for k in range(1, len(c)):
                if a[i][j] > (c[k] - const) and a[i][j] < (c[k] + const): 
                    a_result[i][j] = c[k] 
c[(np.abs(a - c[:,None,None]) < const).argmax(0)]
In [312]: a
Out[312]: 
array([[ 0.02,  1.01,  4.01,  3.  ,  5.12],
       [ 2.11,  1.5 ,  3.98,  0.52,  5.01]])

In [313]: c
Out[313]: array([0, 1, 4, 5])

In [314]: c[(np.abs(a - c[:,None,None]) < const).argmax(0)]
Out[314]: 
array([[0, 1, 4, 0, 0],
       [0, 0, 4, 0, 5]])
mask = ((c[:,None,None] - const)  < a) & (a < (c[:,None,None] + const))
out = c[mask.argmax(0)]
idx = np.searchsorted(c, a, side="left").clip(max=c.size-1)
mask = (idx > 0) &  \
     ( (idx == len(xx)) | (np.fabs(yy - xx[idx-1]) < np.fabs(yy - xx[idx])) )
idx0 = idx-mask
out = xx[idx0]
out[np.abs(c[idx0] - a) >= const] = 0