私はその前に、特定のnditer
チュートリアルを見ていません。
https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.nditer.html
は私が使用したものです。そして、私は人々に、このPythonインターフェイスを使ってnditer
を教え続けているが、効率的ではない。このページは、最後のcython
の例に示すように、Cコードでnditer
を使用するための足掛かりとして最も役立ちます。
np.nditer
(Pythonコード)を使用するnumpy関数はあまりありません。 np.ndindex
は数少ないものの1つです。コードを読む価値があります。 np.einsum
はこのイテレータを使用しますが、コンパイルされたコードです。
問題の例を読んでコメントを残しておきます。 nditer
を使うよりも放送をうまく使うことを学ぶことが重要です。
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
等価普通Pythonの反復:(12を作るために
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)]
使用np.array(list(np.broadcast(a,b)))
:
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
(4)と(3,4)配列をブロードキャストします2)配列。
、または同じプリントを持つ:
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
あなたの反復:あなたは2番目の列が繰り返さb
ことを期待する場合
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]])
おっとは、何かオフのように見えます。
a
とb
をこの種の配列に組み合わせる方法は多数あります。
これは2d a
を1dに変えます。 (column_stack
が同様に働いているだろう)tile
とb
を複製し、stack
とそれらを結合します
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]])