0

私はいくつかの計算を行っている配列を持っています。配列は次のように始まります

e = array([[1,2,1,3],
           [3,-1,-3,-1],
           [2,3,1,4]])

少し変更して、次のように変換します。

array([[  1,   2,   1,   3],
      [  0,  -7,  -6, -10],
      [  0,  -1,  -1,  -2]])

次に、このコードを実行します。

import numpy as np
from fractions import Fraction

def ref(x):
    dimension = x.shape
    row_counter = 1
    first_values = [x[i][row_counter] for i in range(dimension[0])]                               #gets a list of elements of the column
    first_values = [number != 0 for number in first_values]                                       #0 is a pivot element?
    if False in first_values:                                                                     
        true_index =  first_values.index(True); false_index =   first_values.index(False)
        if true_index > false_index:                                                               #not any more
            x[[false_index, true_index]] = x[[true_index, false_index]]

    for i in range(row_counter+1,dimension[0]):
        multiplier = Fraction(x[row_counter][row_counter], x[i][row_counter])**-1
        row1 = multiplier*x[row_counter]
        row1 = x[i]-row1
        print row1
        x[i] = row1   

return x

これを実行すると、次が返されます。

[0 0 -1/7 -4/7]
array([[  1,   2,   1,   3],
         [  0,  -7,  -6, -10],
         [  0,   0,   0,   0]])

したがって、結果は

array([[  1,   2,   1,   3],
         [  0,  -7,  -6, -10],
         [  0, 0, -1/7, -4/7]])

正しい行エントリを出力しますが、配列に追加されず、代わりにゼロの行が追加されます。誰かが理由を教えてください。ありがとう。

4

1 に答える 1

2

一般に、numpy配列は特定の型と同種です。例えば:

>>> a = np.array([1,2,3])
>>> a
array([1, 2, 3])
>>> a.dtype
dtype('int64')

要素またはスライスを具体的に設定すると、追加したものが現在の に強制されるため、次のdtypeようになります。

>>> a[0] = 5
>>> a
array([5, 2, 3])

しかし

>>> a[0] = 4.3
>>> a
array([4, 2, 3])

その場で行動していないときにアップキャストを取得できるためnumpy、とにかくコピー(つまり、新しいオブジェクト)を作成する必要があります。

>>> a = np.array([1,2,3])
>>> a + 4.3
array([ 5.3,  6.3,  7.3])
>>> (a + 4.3).dtype
dtype('float64')

あなたの場合、numpydtype の配列から始めると、必要な動作を得ることができますobject:

>>> e = np.array([[  1,   2,   1,   3],
...               [  0,  -7,  -6, -10],
...               [  0,  -1,  -1,  -2]], dtype=object)
>>> 
>>> ref(e)
array([[1, 2, 1, 3],
       [0, -7, -6, -10],
       [0, 0, -1/7, -4/7]], dtype=object)
于 2013-01-17T02:52:05.680 に答える