ここで、関数fをパラメータとして取り、整数(この場合はf(x))を返します。座標は多次元であり、リストの形式である。私の目標は、2つの座標間のすべての値を数え切れない配列に塗りつぶすことです。私はすべての可能なインデックスのリストを作成し、それをベクトル化された関数の入力として使用しようとしました。ここでnumpyで座標のn次元配列を生成する
は、2次元座標のために私のコードです:
import itertools
import numpy
def index_array(lower_corner, upper_corner):
x_range = range(lower_corner[0], upper_corner[0])
y_range = range(lower_corner[1], upper_corner[1])
return numpy.array(list(itertools.product(x_range, y_range)))
print(index_array([2, -2], [5, 3]))
期待のようにこれは、インデックスのリストを返します。
import itertools
import numpy
def f(x):
# dummy function
return x + 5
def index_array(lower_corner, upper_corner):
# returns all indices between two n-dimensional points
range_list = []
for n in range(len(lower_corner)):
range_list.append(range(lower_corner[n], upper_corner[n]))
return numpy.array(list(itertools.product(*range_list)))
lower_corner = numpy.array([2, -2])
upper_corner = numpy.array([5, 3])
indices = index_array(lower_corner, upper_corner)
vect_func = numpy.vectorize(f)
results = vect_func(indices)
print(results)
:
[[ 2 -2]
[ 2 -1]
[ 2 0]
[ 2 1]
[ 2 2]
[ 3 -2]
[ 3 -1]
[ 3 0]
[ 3 1]
[ 3 2]
[ 4 -2]
[ 4 -1]
[ 4 0]
[ 4 1]
[ 4 2]]
そしてここでは、n次元のための私の試みです
これは動作が遅く、膨大なメモリが必要です。より効率的な方法でこれを書くことが可能ですか?私はnumpy.meshgridの使用について考えることができましたが、どのように使用するのか分かりません。以下に示すように
のErm、私はすでに '' itertools'からproduct'を使用しています。 2番目の関数Dの復帰では隠されています。D。しかし、よりコンパクトなループのおかげで! – Gnarflord
'range(* r)'で 'range(r [0]、r [1])'を変更することができます。また、すぐに解凍されるリストコンパイルを使用しています。代わりにgen expを使用することができます( '*(range(* r)...)' '[] 'を'() 'に置き換えて)、その一時的なリストを作成しないでください。 – Bakuriu
@Bakuriuそれを指摘してくれてありがとうございます。私が信じるはるかに効率的で簡潔な解決策です。 – Psidom