0

2D配列を読み込んで出力する関数があります。0 に等しい入力のすべてのインデックスに対して、出力を一定 (この場合は pi) にしたいのですが、それ以外の場合は、それにいくつかの計算を実行します。例えば:

import numpy as np
import numpy.ma as ma

def my_func(x):

    mask = ma.where(x==0,x)

    # make an array of pi's the same size and shape as the input
    y = np.pi * np.ones(x)

    # psuedo-code bit I can't figure out
    y.not_masked = y**2

    return y 

my_array = [[0,1,2],[1,0,2],[1,2,0]]

result_array = my_func(my_array)

これにより、次のようになります。

result_array = [[3.14, 1, 4],[1, 3.14, 4], [1, 4, 3.14]]

y**2つまり、ゼロに等しくない 2D リストの各要素に適用され、すべてのゼロが pi に置き換えられました。

私の関数には除算が含まれており、事前にインデックスがわからないため、これが必要です。教科書の matlab チュートリアルを Python に変換しようとしていますが、この機能に困惑しています!

ありがとう

4

3 に答える 3

1

マスクを使用するのではなく、ブール配列を使用して目的を達成することをお勧めします。

def my_func(x):
    #create a boolean matrix, a, that has True where x==0 and
    #False where x!=0 

    a=x==0

    x[a]=np.pi

    #Use np.invert to flip where a is True and False so we can 
    #operate on the non-zero values of the array

    x[~a]=x[~a]**2

    return x #return the transformed array

my_array = np.array([[0.,1.,2.],[1.,0.,2.],[1.,2.,0.]])

result_array = my_func(my_array)

これにより、出力が得られます。

array([[ 3.14159265,  1.        ,  4.        ],
       [ 1.        ,  3.14159265,  4.        ],
       [ 1.        ,  4.        ,  3.14159265]])

特にnumpy配列を関数に渡したことに注意してください。最初はリストを渡していたため、数学演算を実行しようとすると問題が発生します。また、配列を 1 だけでなく 1 で定義したことにも注意してください。これは、整数ではなく浮動小数点数の配列であることを確認するためです。値を pi に設定したときに整数の配列である場合、3 に切り捨てられるためです。

おそらく、関数にピースを追加して、入力引数の dtype をチェックし、それがリストやその他のオブジェクトではなく numpy 配列であるかどうかを確認し、float が含まれていることを確認することをお勧めします。それに応じて調整します。

編集: Scotty1 の提案に従って、invert(a) ではなく ~a を使用するように変更します。

于 2018-05-25T13:36:01.483 に答える