frompyfunc的調用格式爲frompyfunc(func, nin, nout),其中func是計算單個元素的函數,nin是此函數的輸入參數的個數,nout是此函數的返回值的個數python
# 注:用frompyfunc獲得的函數計算出的數組元素的類型爲object,由於frompyfunc函數沒法保證Python函數返回的數據類型都徹底一致數組
1. 建立通用函數(步驟)
# 定義一個python函數函數
import numpy as np def answer(a): result = np.zeros_like(a) result.flat = 42 return result ufunc = np.frompyfunc(answer, 1, 1) print (ufunc(np.arange(4))) # [array(42) array(42) array(42) array(42)]
# 對二維數組進行操做對象
A = ufunc(np.arange(4).reshape(2,2)) print (A) #[[array(42) array(42)] # [array(42) array(42)]]
# 解析:定義了一個Python函數。其中,咱們使用zeros_like函數根據輸入參數的形狀初始化一個全爲0的數組,而後利用ndarray對象的flat屬性將全部的數組元素設置爲「終極答案」其值爲42blog
2. 通用函數的方法
通用函數有四個方法,不過只對輸入兩個參數、輸出一個參數的ufunc對象有效遞歸
# add 上調用通用函數的方法索引
(1). reduce方法 (對數組的reduce計算結果等價於對數組元素求和)class
import numpy as np B = np.arange(9) B1 = np.add.reduce(B) print (B1) # 36
(2). accumulate方法(能夠遞歸做用於輸入數組,將存儲運算的中間結果並返回)import
B2 = np.add.accumulate(B) print (B2) # [ 0 1 3 6 10 15 21 28 36]
(3). reduceat方法須要輸入一個數組以及一個索引值列表做爲參數object
B3 = np.add.reduceat(B,[0,5,2,7]) print (B3) # [10 5 20 15]
# 解析:第一步用到索引值列表中的0和5,實際上就是對數組中索引值在0到5之間的元素進行reduce操做。
print (np.add.reduce(B[0:5]))
# 第二步用到索引值5和2。因爲2比5小,因此直接返回索引值爲5的元素
print (np.add.reduce(B[5]))
# 第三步用到索引值2和7。這一步是對索引值在2到7之間的數組元素進行reduce操做
print (np.add.reduce(B[2:7]))
# 第四步用到索引值7。這一步是對索引值從7開始直到數組末端的元素進行reduce操做
print (np.add.reduce(B[7:]))
(4). outer方法返回一個數組,它的秩(rank)等於兩個輸入數組的秩的和。它會做用於兩個輸入數組之間存在的全部元素對
B4 = np.add.outer(np.arange(3),B) print (B4) #[[ 0 1 2 ..., 6 7 8] # [ 1 2 3 ..., 7 8 9] # [ 2 3 4 ..., 8 9 10]]