numpy矩阵根据输入输出类型不同的两种函数映射方法 郝伟 2021/05/19 [TOC]
1. 简介
在numpy的矩阵中,遍历操作是常见的操作。不同于普通的数组的循环,numpy提供了函数映射功能,可以使用与map相似的机制,将对所有的数据进行相同的函数操作。本文将介绍两种函数映射的方法,一种是输入输出类型相同的映射,另一种是输入输出不同的操作。
2. 类型1:输入输出的数据类型相同的函数映射
这类映射相对比较简单,可以直接进行映射的调用,请看如下示例。
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]]
3. 类型2:输入输出的数据类型相同的函数映射
输入与输出类型不同时,就需要使用 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']]
4. 附:完整代码
# 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']]