2017-02-19 5 views
3

Ich habe eine Nummer array([1.0, 2.0, 3.0]), die eigentlich ein Netz in 1 Dimension in meinem Problem ist. Was ich tun möchte, ist das Netz zu verfeinern, um dies zu erhalten: 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,]).Wie ein Netz in Python schnell zu verfeinern

Das eigentliche Array ist sehr groß und dieses Verfahren kostet viel Zeit. Wie geht das schnell (vielleicht vektorisieren) in Python?

Antwort

2

Hier ist ein vektorisiert Ansatz -

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

Probelauf -

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]) 
+1

Großartig! Mehr als Hälfte Zeit von Option 3 in Psidoms anwser ist gerettet! –

2

Hier sind ein paar Optionen (Python 3):

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

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

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

-Timing in einem größeren Array:

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

Hallo, ich habe ein bekam neue Idee: '(np.file (np.arange (-0.2, 0.25, 0.1) [Keine,:], (n, 1)) + arr [:, Keine]). flatten()', wobei 'n = 100000' in Ihrem Post.Es scheint, dass ich ein 'for' in Ihrer Option 3 vermieden, aber die Leistung ist mehr oder weniger das gleiche. Warum? –

+0

Schön, das sieht eine numplige Option aus. Die Leistung ist höchstwahrscheinlich, weil der 'np.bereich (-0,2, 0,25, 0,1 ') nur fünf Elemente enthält, so dass die Zeit zum Durchlaufen vernachlässigbar ist. Wenn dies ein viel größeres Array ist, sehen Sie möglicherweise einen Unterschied. – Psidom

+1

Nicht viel Unterschied, wenn ich 'np.arange (-0.2, 0.25, 0.1) 'zu' np.arange (-0.2, 0.25, 0.001)' ändere. Möglicherweise ist Listenverstehen bereits sehr leistungsfähig. –

Verwandte Themen