2016-06-12 20 views
3

最近質問した質問hereに私が尋ねたとおりに答えられました。しかし、私は答えをさらに操作する私の能力を過大評価したと思います。私は放送の文書を読んで、いくつかのリンクをたどって、2002年にnumpyの放送について私に戻ってきました。ナンシー放送についての解答

私はbroadcastingを使用してアレイを作成する第二の方法を使用しました:

[[0,0,0,0] 
[0,0,1,0] 
... 
[0,1,0,0] 
[0,1,1,0] 
... 
[9,9,8,0] 
[9,9,9,0]] 

を私はそれを操作する方法のドキュメントを経由して理解していない:

N = 10 
out = np.zeros((N**3,4),dtype=int) 
out[:,:3] = (np.arange(N**3)[:,None]/[N**2,N,1])%N 

出力します。私は理想的には、個々の列が変化するインクリメントを設定できるようにしたいと考えています。

ex。 10.

[[0,0,0,0] 
[0,0,1,0] 
... 
[0,0,9,0] 
[0,0.2,0,0] 
... 
[0,0.8,9,0] 
[0.5,0,0,0] 
... 
[1.5,0.8,9,0]] 

まで1によって2まで0.5によって列Aの変化、1まで0.2カラムBの変更、および列Cの変更任意の助けてくれてありがとう。

答えて

4

現在のコードを調整するだけで、動作させることができます。

>>> out = np.zeros((4*5*10,4)) 
>>> out[:,:3] = (np.arange(4*5*10)[:,None]//(5*10, 10, 1)*(0.5, 0.2, 1)%(2, 1, 10)) 
>>> out 
array([[ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 1. , 0. ], 
     [ 0. , 0. , 2. , 0. ], 
     ... 
     [ 0. , 0. , 8. , 0. ], 
     [ 0. , 0. , 9. , 0. ], 
     [ 0. , 0.2, 0. , 0. ], 
     ... 
     [ 0. , 0.8, 9. , 0. ], 
     [ 0.5, 0. , 0. , 0. ], 
     ... 
     [ 1.5, 0.8, 9. , 0. ]]) 

変更点は次のとおりです。

  1. アレイ上ノーint DTYPE、我々はそれを必要とするため、一部の列で山車を保持します。必要に応じてfloat dtypeを指定することもできます(または、最初の2つの列に浮動小数点数を入れるだけの複雑な方法もあります)。
  2. N**3合計値ではなく、各列の個別値の数を計算し、それらを掛け合わせて合計サイズを取得します。これはzerosarangeの両方に使用されます。
  3. 最初のブロードキャスト操作ではfloorの//演算子を使用します。この時点で整数が必要ですが、後で浮動小数点演算が必要になります。
  4. また、除算する値は、後の列の値の数に基づいています(たとえば、A,B,Cの数値の場合は、B*C, C, 1で割ります)。
  5. 新しいブロードキャスト操作を追加して、さまざまなスケールファクタ(各値がどれだけ増加するか)を乗算します。
  6. ブロードキャストの修飾子%の値を各列の境界に一致するように変更します。
3

この小さな例では、私は何が起こっているか理解するのに役立ちます:

In [123]: N=2  
In [124]: np.arange(N**3)[:,None]/[N**2, N, 1] 
Out[124]: 
array([[ 0. , 0. , 0. ], 
     [ 0.25, 0.5 , 1. ], 
     [ 0.5 , 1. , 2. ], 
     [ 0.75, 1.5 , 3. ], 
     [ 1. , 2. , 4. ], 
     [ 1.25, 2.5 , 5. ], 
     [ 1.5 , 3. , 6. ], 
     [ 1.75, 3.5 , 7. ]]) 

だから我々は、数字(0〜7)の範囲を生成し、4,2、および1によってそれらを分けます。

計算の残りはちょうどさらに

intアレイに割り当て%N

In [126]: np.arange(N**3)[:,None]/[N**2, N, 1]%N 
Out[126]: 
array([[ 0. , 0. , 0. ], 
     [ 0.25, 0.5 , 1. ], 
     [ 0.5 , 1. , 0. ], 
     [ 0.75, 1.5 , 1. ], 
     [ 1. , 0. , 0. ], 
     [ 1.25, 0.5 , 1. ], 
     [ 1.5 , 1. , 0. ], 
     [ 1.75, 1.5 , 1. ]]) 

各要素を適用放送することなく、各値を変更するには、整数に浮動小数点数に変換すると同じである。

In [127]: (np.arange(N**3)[:,None]/[N**2, N, 1]%N).astype(int) 
Out[127]: 
array([[0, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 1], 
     [1, 0, 0], 
     [1, 0, 1], 
     [1, 1, 0], 
     [1, 1, 1]]) 
関連する問題