如何快速优化python中的网格

时间:2017-02-19 15:16:59

标签: python numpy

我有一个numpy array([1.0, 2.0, 3.0]),实际上是我问题中的1维网格。我想要做的是优化网格以获得这个: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,])

实际的数组非常大,这个过程需要花费很多时间。如何在python中快速完成(也许是vectorize)?

2 个答案:

答案 0 :(得分:2)

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

选项1

np.array([j for i in arr for j in np.arange(i - 0.2, i + 0.25, 0.1)])
# 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])

选项2

np.array([j for x, y in zip(arr - 0.2, arr + 0.25) for j in np.arange(x,y,0.1)])
# 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])

选项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

答案 1 :(得分:2)

这是一种矢量化方法 -

(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])