2016-10-26 6 views
0

Dies ist eine einfache Bedienung ich Probleme mit numpy erreichen habe:Wie verkettet man diese beiden numpigen Arrays?

Ich habe zwei numpy Arrays:

import numpy as np 
arr1 = np.array([12, 13, 14, 15]) 
arr2 = np.array([100, 200, 300, 400]) 

I Arrays möchte vier verschiedene numpy:

a1 = np.array([12, 13, 14, 15, 100]) 
a2 = np.array([12, 13, 14, 15, 200]) 
a3 = np.array([12, 13, 14, 15, 300]) 
a4 = np.array([12, 13, 14, 15, 400]) 

Was das ist "numpythonischer" Weg, dies zu erreichen?

Ich könnte das erste Array mit numpy.tile, z.

repeats = np.tile(arr1, len(arr2)) 

Aber das ist nicht optimal.

Antwort

2

würde ich vier verschiedene numpy Arrays mag:

Sind Sie sicher, dass Sie nicht wollen, ein Array, np.array([a1, a2, a3, a4])?

Aber das ist nicht optimal.

Wenn optimality Ihr Anliegen ist, preallocating Ergebnisse in den wenigsten Exemplare:

N = len(arr1) 
M = len(arr2) 
result = np.zeros((M, N + 1) 
result[:,:N] = arr1 
result[:,N] = arr2 

Wenn Sie wirklich in der Lage sein wollen, diese Art der Sache als Ausdruck zu schreiben, könnte man definieren:

def build_arr(into, parts): 
    for sl, val in parts.items(): 
     into[sl] = val 
    return into 

result = build_arr(np.zeros(M, N + 1), { 
    np.s_[:,:N]: arr1, 
    np.s_[:,N]: arr2 
}) 
1

I np.hstack und einen Generator Ausdruck verwenden würde:

a1, a2, a3, a4 = (np.hstack((arr1, v)) for v in arr2) 

Wenn Sie eine variable Anzahl von Elementen in arr2 dann Sie die resultierenden Arrays in einer Liste speichern könnten, anstatt sie zu Variablennamen Auspacken:

arrs = [np.hstack((arr1, v)) for v in arr2] 

Dynamically creating variables ist fast immer eine schlechte Idee. Wenn Sie eine variable Anzahl von namens Arrays wollen, dann schlage ich vor, Sie speichern sie in einem dict oder einer anderen benannten Python-Struktur. Sie könnten ein dict Verständnis verwenden:

named_arrs = {'a%i' % (i + 1): np.hstack((arr1, v)) for i, v in enumerate(arr2)} 
+0

'a1, a2, a3, a4' Was passiert, wenn ich nicht‘ Wissen Sie a priori die Anzahl der Arrays, die generiert werden sollen? Man müsste die Länge von 'arr2' verwenden. – ShanZhengYang

+0

@ShanZhengYang: Wollen Sie wirklich eine dynamische Anzahl von Variablennamen erstellen?Das ist eine _really_ schlechte Idee – Eric

+1

* "Ich möchte vier verschiedene numpy Arrays" *. Sie könnten die Unterarrays leicht in einer Liste sammeln, wenn Sie sie nicht in separate Variablennamen entpacken möchten, z. 'arrs = [np.hstack ((arr1, v)) für v in arr2]'. –

1

ich eher wie die Verwendung von tile:

In [1684]: np.tile(arr1,[arr2.shape[0],1]) 
Out[1684]: 
array([[12, 13, 14, 15], 
     [12, 13, 14, 15], 
     [12, 13, 14, 15], 
     [12, 13, 14, 15]]) 
In [1685]: np.concatenate((np.tile(arr1,[arr2.shape[0],1]),arr2[:,None]),axis=1) 
Out[1685]: 
array([[ 12, 13, 14, 15, 100], 
     [ 12, 13, 14, 15, 200], 
     [ 12, 13, 14, 15, 300], 
     [ 12, 13, 14, 15, 400]]) 

ein solches 2D-Array ist an sich schon praktisch. Aber es kann in Arrays aufgeteilt werden:

In [1686]: np.split(_,arr2.shape[0]) 
Out[1686]: 
[array([[ 12, 13, 14, 15, 100]]), 
array([[ 12, 13, 14, 15, 200]]), 
array([[ 12, 13, 14, 15, 300]]), 
array([[ 12, 13, 14, 15, 400]])] 

Und wenn Sie wirklich getrennte Namen müssen für diese Arrays, entpacken Sie die Liste:

In [1687]: a1,a2,a3,a4=_ 
In [1688]: a1 
Out[1688]: array([[ 12, 13, 14, 15, 100]]) 
Verwandte Themen