Numpy 通用函式

xie仗劍天涯發表於2017-05-04

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]]

  

 

相關文章