如何在python中快速细化网格
我有一个numpy如何在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
数组([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])