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