2017-01-31 24 views
2

(x, y)の数値配列をN x Nグリッドとして生成しました。Numpyは2D配列を操作して3D配列を生成します

grid = np.meshgrid(np.linspace(0, 1, 50), np.linspace(0, 1, 50))[0] 
grid.shape // (50, 50, 1) 

私は2つのパラメータをとり、3つの値を返す関数を持っています。 すなわち(x, y) -> (a, b, c)

2次元のnumpy配列にこの関数を適用して3次元配列を得るにはどうすればよいですか?

+2

それは '(x、y)の配列は、'値は 'NのXのN'グリッド上でどのように見えるか私には不明ですが...あなたはタプルの2次元配列を持っていること、これが暗示しますか? – mgilson

答えて

3

あなたの機能は本当にあなたがおそらく3xMxNに3dに2dのではなく、2xMxNないマップしたい2つのパラメータを取る場合。このため

gridx, gridy = np.meshgrid(np.linspace(0, 1, 50), np.linspace(0, 1, 50)) 

あるいはあなたの機能fは、配列引数を処理しない場合のように軸

gridy, gridx = np.ix_(np.linspace(0, 1, 50), np.linspace(0, 1, 50)) 

を交換しないという利点を有しているix_より経済的に使用のようなものにあなたの最初の行を変更@ Jacques Gaudinは、おそらくあなたが望むものであると指摘しているnp.vectorizeです。 vectorizeは主に便利な機能であるため、処理が高速化されないことに注意してください。それはix_を使用して、実際にあなたのケースでresultは、50×50の配列、すなわち、の3組が出力ごとにグループ化されていることを

f_wrapped = np.vectorize(f) 
result = f_wrapped(gridy, gridx) 

注意を働く理由は、放送のような便利なことを行います。ベクトル化された関数を連鎖させたい場合に便利です。 1つの大きな配列にすべてを入れたい場合は、resultarrayに変換し、場合によってはtransposeを使用して軸を再配置します。

triplets_last = np.array(result).transpose((1, 2, 0)) 
1

私が正しく理解していれば、あなたはnp.vectorizeデコレータの後です。それを使用することによって、meshgrid上の関数を適用することができます。あなたの関数は、座標を渡さないので、座標に1つのパラメータだけを取る必要があります(値が2つの要素を持つtulpesでない限り)。

import numpy as np 

grid = np.meshgrid(np.linspace(0, 1, 5), np.linspace(0, 1, 5))[0] 

@np.vectorize 
def func(a): 
    return (a, a**.5, a**2) 

res = np.array(list(func(grid))) 
print(res.shape) 
print(res) 
関連する問題