2016-11-18 7 views
2

Pythonに新しく、自分自身に言語を教えようとしています。私はRとSASの基礎を理解していますが、まだ配列を操作し、スパイダーで基本的なPythonを学ぶ方法を学んでいます。xとy配列のすべての組み合わせを関数f(x、y)に渡す

xとyの両方をf(x、y)という関数に簡単に援助してもらいたいです(例:sin(xy))。

通常、Rでは、xとyの値を展開してすべての組み合わせ(行ごとに一意のxとy)を作成し、これらの行を関数で実行してデータフレームに新しい列を追加し、同じ関数f(x、y)= Z = SIN(x、y)のための格子等

を使用して等高線をプロットし、Pythonで私は

x = np.linspace(0, 1, 100) 
y = np.linspace(-1, 11, 100) 
z= np.equ(x,y) 

を試みた明らかに動作wouldntのれるものの私は本当にそれを行う方法がわかりません。 Matplotlib line plot of x values against y

これは、から、次のコードを操作しようとした後にしようとした

import numpy as np 
import matplotlib.pyplot as plt 

fig,ax = plt.subplots(1) 

# create some x data and some integers for the y axis 
x = np.array([3,5,2,4]) 
y = np.arange(4) 

# plot the data 
ax.plot(x,y) 

# tell matplotlib which yticks to plot 
ax.set_yticks([0,1,2,3]) 

# labelling the yticks according to your list 
ax.set_yticklabels(['A','B','C','D']) 

は、任意の助けをありがとう!

+1

http://stackoverflow.com/questions/8722735/i-want-to-use-matplotlib-to-make-a-3d-plot-given-a-z-functionのようなものを試すことができます。ここでは、xsとysを慎重に作成してxとyの組み合わせを作成しています。 – Leo

+0

1つの方法は 'np。長さ 'len(x)* len(y)'の 'linspace'を作成し、この配列の'% '(モジュラス)と'/'(除算)を長さが – martianwars

+0

とすることで行列に2列のベクトルを積み重ねます。 2つのインデックスのリストに対してitertools.combinationsを使用すること。次に、インデックスを使用して配列からアイテムを取得し、それらを関数に渡します。 – kezzos

答えて

1

この場合、itertools.productを使用する必要があります。すべての可能な組み合わせを持つリストを生成するために使用できます。例えば

A = [1, 2]

itertools.productB = [3, 4]は、このような配列に格納することができたのiterableを返す場合、

C = list(itertools.product(A, B)) 
# C = [(1,3), (1,4), (2,3), (2,4)] 
+1

ありがとうございます!私はこれで遊びに行くだろう。ほんとうにありがとう。 – user62622

+1

リスト内包表記の代わりにlist()を使用する – kezzos

+0

編集済み、もう一度見てください@ user62622 – martianwars

1

次の2つの引数を取りufuncを使用している場合は、numpy.meshgrid()を使用このように:

x, y = np.meshgrid(np.linspace(0, 1, 5), np.linspace(-1, 11, 5)) 
r = np.equal(x, y) 

あなた自身の機能を使用している場合二つのアイテムの一つの引数とり - (X、Y)または[X、Y] ...:関数meshgrid

q = np.concatenate((x[...,None],y[...,None]), 2) 

から

def f(one_d_array): 
    return one_d_array[0] == one_d_array[1] 

を連結のxとyのを次にnumpy.apply_along_axis

np.apply_along_axis(f, 2, q) 
を使用

xとyの引数をとる独自の関数を使用している場合は、meshgridから取得した配列を使用します。

def f1(x, y): 
    '''Returns 4x^2 + 2y^2''' 
    return 4*np.square(x) + 2*np.square(y) 

f1(x, y) 

あなたの配列が大きい場合は、全体の配列の代わりに、スライス上で動作するようにあなたの機能を再構築することによりapply_along_axisを使用しないようにしてみてください。

関連する問題