numpy高级应用—ufunc

numpy高级应用—ufunc

  • 1.内置ufunc方法
    • reduce方法
    • outer方法
    • accumulate方法
    • reduceat方法
  • 2.自定义ufunc方法
    • frompyfunc方法
    • vectorize方法

1.内置ufunc方法

numpy高级应用—ufunc_第1张图片
内置的ufunc方法的目的主要是免去了编写循环的代码。使用的形式为 "np.operation_name.ufunc"

reduce方法

对相邻的两个数字进行聚合操作,
在这里插入图片描述

import numpy as np

np.multiply.reduce([2, 3, 5])	# 返回结果30

X = np.arange(8).reshape(2, 2, 2)
# X的形式为
	[[[0, 1],
	  [2, 3]],
	 [[4, 5],
	  [6, 7]]]
np.add.reduce(X, 0)		
# 返回结果
	[[4, 6],
	 [8, 10]]
np.add.reduce(X)	# 默认 axis=0,结果与上方代码相同
	  
np.add.reduce(X, 1)		
# 返回结果
	[[2, 4],
	 [10, 12]]

np.add.reduce(X, 2)		
# 返回结果
	[[1, 5],
	 [9, 13]]

outer方法

在这里插入图片描述
两个一维数组最终生成一个二维数组,(5,)和(5,)生成(5, 5)的数组。

arr = np.arange(3).repeat([1, 2, 2])	# 得到 [0, 1, 1, 2, 2]

np.multiply.outer(arr, np.arange(5))
# 得到
	[[0, 0, 0, 0, 0],
	 [0, 1, 2, 3, 4],
	 [0, 1, 2, 3, 4],
	 [0, 2, 4, 6, 8],
	 [0, 2, 4, 6, 8]]

(3,4)的数组和(5,)的数组生成(3,4,5)的数组。
numpy高级应用—ufunc_第2张图片

accumulate方法

在这里插入图片描述
numpy高级应用—ufunc_第3张图片
对于一维数组而言,

np.add.accumulate([2, 3, 5])	# 返回 [2, 5, 10]
np.multiply.accumulate([2, 3, 5])	# 返回 [2, 6, 30] 

对于二维数组而言,首先创建一个对角矩阵,

I = np.eye(2)
# [[1, 0],
#  [0, 1]]
np.add.accumulate(I, 0)   
# [[1, 0],
#  [1, 1]]

np.add.accumulate(I, 1)
# [[1, 1],
#  [0, 1]]	

accumulate方法和reduce方法的差异就像是cumsum和sum的区别,accumulate方法会产生与原数组相同的记录累积分布的数组。

reduceat方法

相当于pandas的groupby方法,都是用于聚合,但是不如pandas的groupby方法灵活,
numpy高级应用—ufunc_第4张图片

2.自定义ufunc方法

numpy中有两个工具可以将自定义方法像ufunc那样使用。这两个方法在运行时候会比其他numpy方法慢很多,因为其他方法基于C语言,而这两个方法调用传入的方法时使用的是Python的解释器。

frompyfunc方法

该方法接受一个Python函数和两个分别表示输入输出参数数量的整数,
numpy高级应用—ufunc_第5张图片

vectorize方法

该方法没有frompyfunc方法那么强大,但是在类型判断上更胜一筹。
在这里插入图片描述

你可能感兴趣的:(numpy库)