2016-11-18 80 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) 

這顯然難道不工作,但我不確定如何去做。 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功能。在這裏,他們通過仔細創建xs和ys來創建x和y的組合。 – Leo

+0

一種方法是創建一個'np。lnspace'長度爲len(x)* len(y),然後將這個數組的'%'(模數)和'/'(除數)與長度爲 – martianwars

+0

的兩個列向量組合成一個矩陣。可以在兩個索引列表上使用itertools.combinations。然後使用索引從數組中獲取項目並將其傳遞給你的函數 – kezzos

回答

1

在這種情況下,您需要使用itertools.product。它可用於生成具有所有可能組合的列表。

例如,如果A = [1, 2]B = [3, 4]

itertools.product將返回一個迭代可以存儲在一個這樣的數組,

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

謝謝!我會玩這個遊戲。對此,我真的非常感激。 – user62622

+1

只用list()代替列表理解 – kezzos

+0

編輯過,再看看@ user62622 – martianwars

1

如果您使用的是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] ...:

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

拼接在X和Y的從meshgrid

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

然後使用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通過重組你的函數,在整個陣列,而不是片工作。

相關問題