2017-12-02 2 views
0

Während ich durch numpy Tutorials lese, gebe ich mir Herausforderungen, um mein Verständnis zu bauen. Ich habe die quellige Ressource von tutorialpoint.com durchgelesen, als ich im letzten Beispiel gesehen habe, dass ihr modifiziertes End-Array nicht wirklich ein Array war.Kombinieren von zwei numply Arrays in verschiedenen Dimensionen

zur Seite, Rundfunk Iteration Beispiel: https://www.tutorialspoint.com/numpy/numpy_iterating_over_array.htm

Also beschloss ich, es wäre eine schöne Herausforderung sein, das gleiche Endprodukt als ein Array zu versuchen und zu erstellen. Es ist mir gelungen, aber ich konnte np.nditer weder benutzen noch war ich in der Lage, Broadcasting zu verwenden, obwohl ich sicher bin, dass es einen Weg geben muss, beide zu nutzen.

Hier ist mein Code:

a = np.arange(0,60,5) 
a = a.reshape(12,1) 
b = np.arange(1,5) 
arr = np.zeros((12,2)) 

counter = 0 
for i in range(arr.shape[0]): 
    if counter < 4: 
     arr[i,:] = np.array([a[i],b[counter]]) 
     counter += 1 
    else: 
     counter = 0 
     arr[i,:] = np.array([a[i],b[counter]]) 

print arr 

Wie kann ich dies tun effizient?

Antwort

0

Ich habe diese bestimmte nditer Tutorial zuvor nicht gesehen.
https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.nditer.html

ist derjenige, den ich benutzt habe. Und ich erzähle Leuten, nditer, mit dieser Python-Schnittstelle, ist nicht effizient. Diese Seite ist am nützlichsten als Einstieg in die Verwendung von nditer im C-Code, wie im letzten Beispiel dargestellt.

Es gibt nicht viele numpy Funktionen, die np.nditer (in Python-Code) verwenden. np.ndindex ist einer der wenigen. Es lohnt sich, den Code zu lesen. np.einsum verwendet diesen Iterator, aber im kompilierten Code.

Ich nehme mir später Zeit, um das Beispiel zu lesen und zu kommentieren. Es ist wichtiger, Broadcasting gut zu nutzen, als nditer zu verwenden.

In [212]: a=np.arange(0,60,5).reshape(3,4) 
In [213]: a 
Out[213]: 
array([[ 0, 5, 10, 15], 
     [20, 25, 30, 35], 
     [40, 45, 50, 55]]) 
In [214]: b=np.arange(1,5) 
In [215]: b 
Out[215]: array([1, 2, 3, 4]) 

In [225]: for x,y in np.nditer([a,b]): 
    ...:  print("%d:%d"%(x,y), end=' ') 
    ...: print() 
0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4 

Equivalent Klar Python Iteration:

In [231]: for row in a: 
    ...:  for x,y in zip(row,b): 
    ...:   print("%d:%d"%(x,y), end=' ') 
    ...: print() 
    ...: 
0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4 

np.broadcast werden mit dem (3,4) -Array Broadcast (4):

In [234]: np.broadcast(a,b) 
Out[234]: <numpy.broadcast at 0x9c2a7f8> 
In [235]: list(_) 
Out[235]: 
[(0, 1), 
(5, 2), 
(10, 3), 
(15, 4), 
(20, 1), 
(25, 2), 
(30, 3), 
(35, 4), 
(40, 1), 
(45, 2), 
(50, 3), 
(55, 4)] 

Verwenden np.array(list(np.broadcast(a,b))) a zu machen (12, 2) Array.

Oder mit dem gleichen Druck:

In [237]: for x,y in np.broadcast(a,b): 
    ...:  print("%d:%d"%(x,y), end=' ') 
    ...: print() 
    ...: 
0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4 

Ihre Iteration:

In [251]: arr = np.zeros((12,2),dtype=int) 
    ...: counter = 0 
    ...: for i in range(arr.shape[0]): 
    ...:  if counter < 4: 
    ...:   arr[i,:] = np.array([a.flat[i],b[counter]]) 
    ...:   counter += 1 
    ...:  else: 
    ...:   counter = 0 
    ...:   arr[i,:] = np.array([a.flat[i],b[counter]]) 
    ...:   
In [252]: arr 
Out[252]: 
array([[ 0, 1], 
     [ 5, 2], 
     [10, 3], 
     [15, 4], 
     [20, 1], 
     [25, 1], 
     [30, 2], 
     [35, 3], 
     [40, 4], 
     [45, 1], 
     [50, 1], 
     [55, 2]]) 

Hoppla, sieht aus wie etwas aus, wenn Sie die zweite Spalte erwarten b eine wiederholte zu sein.

Es gibt viele Möglichkeiten, a und b in diese Art von Array zu kombinieren.

Dies verwandelt die 2d a in eine 1d; repliziert b mit tile und verbindet sie mit stack (column_stack würde auch gearbeitet haben):

In [264]: np.stack((a.flat, np.tile(b,3)),1) 
Out[264]: 
array([[ 0, 1], 
     [ 5, 2], 
     [10, 3], 
     [15, 4], 
     [20, 1], 
     [25, 2], 
     [30, 3], 
     [35, 4], 
     [40, 1], 
     [45, 2], 
     [50, 3], 
     [55, 4]]) 
Verwandte Themen