numpy矩阵根据输入输出类型不同的两种函数映射方法
郝伟 2021/05/19
在numpy的矩阵中,遍历操作是常见的操作。不同于普通的数组的循环,numpy提供了函数映射功能,可以使用与map相似的机制,将对所有的数据进行相同的函数操作。本文将介绍两种函数映射的方法,一种是输入输出类型相同的映射,另一种是输入输出不同的操作。
这类映射相对比较简单,可以直接进行映射的调用,请看如下示例。
import numpy as np # 定义一个2*3的变量 x x=np.array([[1,4,5], [3,2, 6]]) print(' 输入矩阵:x '.center(60, '-')) print(x) # 相同数据类型可以直接进行映射,比如求 x^2 fun_square = lambda t: t ** 2 res_square = np.array([fun_square(xi) for xi in x]) print(' 求x的平方 '.center(60, '-')) print(res_square)
输出结果为:
-------------------------- 输入矩阵:x --------------------------
[[1 4 5]
[3 2 6]]
-------------------------- 求x的平方 ---------------------------
[[ 1 16 25]
[ 9 4 36]]
输入与输出类型不同时,就需要使用 np.vectorize(fun) 方法,进行映射函数的矢量化处理,示例如下所示。
import numpy as np def get_fruit_name(id): ''' 本函数用于将指定id映射为fruit_names中的水果名称''' fruit_names=['Apple', 'Banana', 'Orange', 'Peach', 'Berry', 'Lemon'] return fruit_names[id % len(fruit_names)] # 定义一个2*3的变量 x x=np.array([[1,4,5], [3,2, 6]]) print(' 输入矩阵:x '.center(60, '-')) print(x) # 不同数据类型的映射(如整型转字符串)的核心是用 np.vectorize(fun) 将映射函数矢量化后再调用 vectorized_fun = np.vectorize(get_fruit_name) print(' 将x映射为水果名称矩阵(int to stri) '.center(60, '-')) print(vectorized_fun(x))
输出结果为:
-------------------------- 输入矩阵:x --------------------------
[[1 4 5]
[3 2 6]]
----------------- 将x映射为水果名称矩阵(int to stri) -----------------
[['Banana' 'Berry' 'Lemon']
['Peach' 'Orange' 'Apple']]
# encoding=utf-8 ''' 作者:郝伟老师 描述:对ndarray进行不同数据类型的函数映射,如将整型矩阵A中的所有值进行str()映射为字符串矩阵。 包括: * 相同类型:int to int * 不同类型:int to str 历史: * 2021/05/19 建立 资料: * numpy中的广播机制 https://www.cnblogs.com/jiaxin359/p/9021726.html ''' import numpy as np def get_fruit_name(id): ''' 本函数用于将指定id映射为fruit_names中的水果名称''' fruit_names=['Apple', 'Banana', 'Orange', 'Peach', 'Berry', 'Lemon'] return fruit_names[id % len(fruit_names)] # 定义一个2*3的变量 x x=np.array([[1,4,5], [3,2, 6]]) print(' 输入矩阵:x '.center(60, '-')) print(x) # 相同数据类型可以直接进行映射,比如求 x^2 fun_square = lambda t: t ** 2 res_square = np.array([fun_square(xi) for xi in x]) print(' 求x的平方 '.center(60, '-')) print(res_square) # 不同数据类型的映射(如整型转字符串)的核心是用 np.vectorize(fun) 将映射函数矢量化后再调用 vectorized_fun = np.vectorize(get_fruit_name) print(' 将x映射为水果名称矩阵(int to stri) '.center(60, '-')) print(vectorized_fun(x))
输出结果为:
-------------------------- 输入矩阵:x --------------------------
[[1 4 5]
[3 2 6]]
-------------------------- 求x的平方 ---------------------------
[[ 1 16 25]
[ 9 4 36]]
----------------- 将x映射为水果名称矩阵(int to stri) -----------------
[['Banana' 'Berry' 'Lemon']
['Peach' 'Orange' 'Apple']]