2017-12-02 13 views
0

の2 numpyの配列を組み合わせることで、私はnumpyのチュートリアルを読んで、私は自分自身に私の理解を構築するための課題を与えます。最後の例で、最終製品の変更された配列が実際に配列ではないことがわかったとき、私はtutorialpoint.comのnumpyリソースを通して読んでいました。ページの異なる寸法

ボトム、放送反復例: https://www.tutorialspoint.com/numpy/numpy_iterating_over_array.htm

だから私は、配列として同じ最終製品を試してみて、作成するための素敵な挑戦だろうことを決めました。私は成功しましたが、np.nditerを使用することはできませんでしたし、放送を利用することもできませんでしたが、どちらか/両方を利用する方法がなければなりません。ここで

は私のコードです:

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 

私はより効率的にこれを行うことができますどのように?

答えて

0

私はその前に、特定の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]]) 

おっとは、何かオフのように見えます。

abをこの種の配列に組み合わせる方法は多数あります。

これは2d aを1dに変えます。 (column_stackが同様に働いているだろう)tilebを複製し、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]])