3

次の配列があるとします。

In [29]: a = array([[10, 20, 30, 40, 50], [14, 28, 42, 56, 70], [18, 36, 54, 72, 90]])

Out[30]: a
array([[ 0,  0,  0,  0,  0],
       [14, 28, 42, 56, 70],
       [18, 36, 54, 72, 90]])

次に、3 行目を最初の行で除算します (将来のインポート除算を使用)

In [32]: a[0]/a[2]
Out[32]: array([ 0.55555556,  0.55555556,  0.55555556,  0.55555556,  0.55555556])

ループ内の各行で同じことを行います。

In [33]: for i in range(3):
            print a[i]/a[2]   
[ 0.55555556  0.55555556  0.55555556  0.55555556  0.55555556]
[ 0.77777778  0.77777778  0.77777778  0.77777778  0.77777778]
[ 1.  1.  1.  1.  1.]

すべてが正しく見えます。しかしここで、最初の配列 a[i]/a[2] を a[i] に割り当てます。

In [35]: for i in range(3):
            a[i]/=a[2]
   ....:     

In [36]: a
Out[36]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1]])

よし、問題ない。これは仕様によるものです。代わりに、次のことを行う必要があります。

In [38]: for i in range(3):
            a[i] = a[i]/a[2]
   ....:     

In [39]: a
Out[39]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1]])

しかし、それはうまくいきません。なぜ、どうすれば修正できますか?

前もって感謝します。

4

3 に答える 3

6

float最初に配列全体を配列にキャストできます。

a = a.astype('float')
a /= a[2]
于 2012-10-20T05:21:56.400 に答える
4

「これが機能しない理由」-機能しない理由は、作成時にnumpy配列にデータ型があるためです。その配列に別の型を入れようとすると、適切な型にキャストされます。つまり、float を整数配列に入れようとすると、numpy は float を int にキャストします。これの背後にある理由は、最適なパフォーマンスを得るために、numpy 配列が同種の型になるように設計されているためです。別の言い方をすれば、これらは C では配列として実装されます。また、C では、1 つの要素が afloatで次が anである配列を持つことはできませんint。(structそのように動作する s を持つことはできますが、それらは配列ではありません)。

別の解決策 (@nneonneo によって提案されたものに加えて) は、最初から配列を float 配列として指定することです。

a = array([[10, 20, 30, 40, 50], [14, 28, 42, 56, 70], [18, 36, 54, 72, 90]], dtype=float)
于 2012-10-20T05:33:06.757 に答える
3

それが割り当てである問題であるのは部門ではありません。つまり、a[i] = ...(これは、舞台裏でも使用されますa /= ...)。これを試して:

>>> a = np.zeros(3, dtype='uint8')
>>> a[:] = [2, -3, 5.9]
>>> print a
[  2 253   5]

numpyを実行するときはintarray[i] = floatarray[i]、浮動小数点値を切り捨ててに合わせる必要がありintarrayます。

于 2012-10-20T05:39:00.487 に答える