2017-09-06 198 views
0

應用函數的兩個numpy的陣列我有通過迭代在Python

import numpy as np 
a = np.array([np.nan,2,3]) 
b = np.array([1,np.nan,2]) 

我想一個函數適用於A,B,有沒有這樣做的一個快速的方法。 (像在熊貓,我們可以做到這一點)

具體而言,我很有趣的平均a和b,但取平均值是其他數字丟失時的數字之一。

即我想返回

np.array([1,2,2.5]) 

對於上面的例子。不過,我想知道這個問題的答案在更一般的設置(在這裏我想申請的操作元素明智了許多numpy的陣列)

回答

1

您可以使用numpy.nanmean,而忽略NaN S:

np.nanmean([a, b], axis=0) 
# array([ 1. , 2. , 2.5]) 
+0

不錯。我用np.vectorize。這很慢嗎? – Lost1

+2

'np.vectorize'使代碼更短,但它不會加快速度。 「np.vectorize」的文檔說明說明了* vectorize'函數主要是爲了方便,而不是爲了性能。這個實現本質上是一個for循環。* – Psidom

+3

@ Lost1,我懷疑'np.vectorize'會有'pandas'' apply'的速度。我沒有使用'apply',但是我對其他問題的印象是它是迭代的(在Python中)級別。與這樣編譯的'numpy'函數相比,兩者都會很慢。 – hpaulj

1

如果你想遍歷數組NumPy的一些自定義的功能與NumPy的的universal functions (ufunc)的效率,選用的是

下面是後者,在功能exp(x) + log(y)的例子(因爲與NumPy的ufuncs explog已經上市,這只是爲了演示):

import numpy as np 
import sympy as sym 
from sympy.utilities.autowrap import ufuncify 

x, y = sym.symbols('x y') 
f = ufuncify([x, y], sym.exp(x) + sym.log(y)) 

現在申請f(np.array([1, 2, 3]), np.array([4, 5, 6]))將返回NumPy的數組[4.10457619, 8.99849401, 21.87729639]的方式不是Python循環,而是調用(默認情況下)編譯的Fortran代碼。

(但在實踐中,你可能會發現,與NumPy已經有一些ufuncs你想要什麼,如果組合在一個正確的方式做到這一點。)