frompyfunc的呼叫格式為frompyfunc(func, nin, nout),其中func是計算單個元素的函式,nin是此函式的輸入引數的個數,nout是此函式的返回值的個數
# 注:用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屬性將所有的陣列元素設定為“終極答案”其值為42
2. 通用函式的方法
通用函式有四個方法,不過只對輸入兩個引數、輸出一個引數的ufunc物件有效
# add 上呼叫通用函式的方法
(1). reduce方法 (對陣列的reduce計算結果等價於對陣列元素求和)
import numpy as np B = np.arange(9) B1 = np.add.reduce(B) print (B1) # 36
(2). accumulate方法(可以遞迴作用於輸入陣列,將儲存運算的中間結果並返回)
B2 = np.add.accumulate(B) print (B2) # [ 0 1 3 6 10 15 21 28 36]
(3). reduceat方法需要輸入一個陣列以及一個索引值列表作為引數
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]]