2017-08-03 11 views
1

func(x、y)= cos(x)+ sen(y)+ x * yのようなランダムな関数を2つの配列の要素のすべてのペアに適用するにはどうすればよいですか?Pythonで外部関数を計算するにはどうすればよいですか?

私が見つけたhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.outer.htmlと は、すべての基本的な操作のために外側の機能があることを発見しました。しかし、もし私がカスタム関数でそれをやりたいのであれば?

F [配列1は、[1,2]、配列2は、[3,4]、およびIを適用したかった関数をf(フロート、フロート)

呼ばれるされる期待出力

あろう想像限り、あなたはそれが適切に放送するような方法で、あなたの関数を記述してくださいと(1,3)は、f(1,4)

F(2,3)は、f(2,4)]

答えて

2

、することができます

f(x_arr[:, None], y_arr) 

2つの1次元配列x_arry_arrのすべての要素のペアに適用します。例えば

は、ブロードキャストは、あなたがアレイ間でnp.cosnp.sin+、および*放送とベクトル化以来

def func(x, y): 
    return np.cos(x) + np.sin(y) + x*y 

としてそれを書きたいような方法であなたの例の関数を記述します。


ブロードキャストしないのはどうですか?さて、いくつかはnp.vectorizeを示唆しているかもしれませんが、それは、一貫した出力dtypeを維持し、副作用を持たないなど、あなたが念頭に置く必要がある多くのトリッキーなことがあります。あなたの関数が放送されない場合は、私は、リストの内包表記を使用してお勧めします。これを解決する

np.array([[f(xval, yval) for yval in y_arr] for xval in x_arr]) 
0

一つの方法は、放送である:

import numpy as np 

def func(x, y): 
    x, y = np.asarray(x)[:, None], np.asarray(y) 
    return np.cos(x) + np.sin(y) + x*y 

[:, None]は、アレイおよびそのトリガに別の次元を追加しますNumPys broadcasting

>>> func([1,2], [3,4]) 
array([[ 3.68142231, 3.78349981], 
     [ 5.72497317, 6.82705067]]) 
0

ネストループを使用してこれを行うことができます。 1つの配列内の1つの要素を使用して、他の配列内のすべての要素を繰り返し、最初の配列内の次の要素に進み、繰り返します。

これは、結果を別の配列に保存したい場合は結果を出力したい場合は簡単ですが、これは動作しますが、多くのリソースを使用します。

関連する問題