2011-12-18 43 views
0

我想找到如何將兩個函數應用到numpy數組,每個只有一半的值。 這是我一直在努力將兩個函數應用到numpy數組的兩半

def hybrid_array(xs,height,center,fwhh): 
    xs[xs<=center] = height*np.exp((-(xs[xs<=center]-center)**2)/(2*(fwhh/(2*np.sqrt(2*np.log(2))))**2)) 
    xs[xs>center] = height*1/(np.abs(1+((center-xs[xs>center])/(fwhh/2))**2)) 
    return xs 

但是我改寫傳遞給參數初始數組的代碼。通常的技巧就是用一個切片複製它。以下依然會改變b。

a = b[:] 
c = hybrid_array(a,args) 

如果沒有做什麼我想任何部分的更好的方法,我會很感激,如果你可以讓我知道,因爲我還是新的NumPy的陣列。 謝謝

回答

3

嘗試copy.deepcopy將數組b複製到a之前調用您的函數。

import copy 
a = copy.deepcopy(b) 
c = hybrid_array(a,args) 

或者,你可以使用數組

a = b.copy() 
c = hybrid_array(a,args) 

注意***的複製方法

你可能會疑惑,爲什麼即使有一個簡單的方法,以一個陣列的複製拷貝numpy數組的方法我介紹了copy.deepcopy。其他的可能不同意,但這裏是我的推理

  1. 使用deepcopy的清楚,你是打算做一個deepcopy的,而不是參考副本
  2. 所有的Python的數據類型不支持複製方法的方法。 Numpy有它,它有它的好處,但是當你用numpy和python進行編程時,你最終可能會使用各種numpy和非numpy數據類型,但不是所有這些類型都支持copy方法。爲了保持一致,我寧願使用第一個。
+0

deepcopy對我來說聽起來更好。感謝您的幫助 – Anake 2011-12-18 20:41:25

+0

由於NumPy數組不包含引用,因此談論深層或淺層副本(無論是否爲副本)是沒有意義的,但是任何進一步的消歧都沒有意義。使用'deepcopy()'較慢,特別是對於較小的數組。 – 2011-12-20 17:54:51

2

複製NumPy數組a使用a.copy()完成。但是,在您的應用程序中,不需要複製舊數據。所有你需要的是與舊的一樣的形狀和dtype的新陣列。您可以使用

result = numpy.empty_like(xs) 

創建這樣一個數組。如果你通常不希望你的函數修改它的參數,你應該在函數內部這樣做,而不是要求調用者處理這個。

+0

可否請您詳細說明,我不明白您如何使用此功能。謝謝 – Anake 2011-12-18 20:32:12

+0

@Anake:您可以通過將代碼行復制到函數的開頭來使用它,然後使用'result'作爲結果。究竟哪一部分不清楚? – 2011-12-20 17:56:23

+0

抱歉,沒有意識到通過複製數組來減慢系統的含義。我現在明白了,謝謝 – Anake 2011-12-30 17:03:11