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

results matching ""

    No results matching ""