如何在python中快速细化网格

如何在python中快速细化网格,python,numpy,Python,Numpy,我有一个numpy数组([1.0,2.0,3.0]),在我的问题中它实际上是一维网格。我想做的是优化网格以获得以下结果:数组([0.8,0.9,1,1.1,1.2,1.8,1.9,2,2.1,2.2,2.8,2.9,3,3.1,3.2,]) 实际阵列非常大,此过程需要花费大量时间。如何在python中快速执行此操作(可能是矢量化)?以下是一些选项(python 3): 备选案文1: 备选案文2: 备选案文3: 较大阵列上的定时: 这是一种矢量化方法- (a[:,None] + np.arang

我有一个numpy
数组([1.0,2.0,3.0])
,在我的问题中它实际上是一维网格。我想做的是优化网格以获得以下结果:
数组([0.8,0.9,1,1.1,1.2,1.8,1.9,2,2.1,2.2,2.8,2.9,3,3.1,3.2,])

实际阵列非常大,此过程需要花费大量时间。如何在python中快速执行此操作(可能是矢量化)?

以下是一些选项(python 3):

备选案文1:

备选案文2:

备选案文3:


较大阵列上的定时:


这是一种矢量化方法-

(a[:,None] + np.arange(-0.2,0.3,0.1)).ravel() # a is input array
样本运行-

In [15]: a = np.array([1.0, 2.0, 3.0])  # Input array

In [16]: (a[:,None] + np.arange(-0.2,0.3,0.1)).ravel()
Out[16]: 
array([ 0.8,  0.9,  1. ,  1.1,  1.2,  1.8,  1.9,  2. ,  2.1,  2.2,  2.8,
        2.9,  3. ,  3.1,  3.2])

您好,我有一个新想法:
(np.tile(np.arange(-0.2,0.25,0.1)[None,:],(n,1))+arr[:,None]).flatte()
,其中
n=100000
,在您的帖子中。在选项3中,我似乎避免了使用
,但性能基本相同。为什么?很好,这看起来是一个更重要的选择。性能很可能是因为
np.arange(-0.2,0.25,0.1)只包含五个元素,因此循环时间可以忽略不计。如果这是一个更大的数组,您可能会看到差异。如果我将
np.arange(-0.2,0.25,0.1)
更改为
np.arange(-0.2,0.25,0.001),则差异不大
。也许列表理解已经非常有效。太好了!Psidom的anwser中选项3节省了一半以上的时间!
np.array([arr + i for i in np.arange(-0.2, 0.25, 0.1)]).T.ravel()
# array([ 0.8,  0.9,  1. ,  1.1,  1.2,  1.8,  1.9,  2. ,  2.1,  2.2,  2.8,
#         2.9,  3. ,  3.1,  3.2])
arr = np.arange(100000)
arr
# array([    0,     1,     2, ..., 99997, 99998, 99999])

%timeit np.array([j for i in arr for j in np.arange(i-0.2, i+0.25, 0.1)])
# 1 loop, best of 3: 615 ms per loop

%timeit np.array([j for x, y in zip(arr - 0.2, arr + 0.25) for j in np.arange(x,y,0.1)])
# 1 loop, best of 3: 250 ms per loop

%timeit np.array([arr + i for i in np.arange(-0.2, 0.25, 0.1)]).T.ravel()
# 100 loops, best of 3: 1.93 ms per loop
(a[:,None] + np.arange(-0.2,0.3,0.1)).ravel() # a is input array
In [15]: a = np.array([1.0, 2.0, 3.0])  # Input array

In [16]: (a[:,None] + np.arange(-0.2,0.3,0.1)).ravel()
Out[16]: 
array([ 0.8,  0.9,  1. ,  1.1,  1.2,  1.8,  1.9,  2. ,  2.1,  2.2,  2.8,
        2.9,  3. ,  3.1,  3.2])