numpy:利用np.frompyfunc函数实现元素级操作,类似pandas的applymap函数功能

       在pandas里,对于DataFrame,可以利用applymap(func)函数实现对DataFrame中每个元素进行函数func操作,而且相比于for loop,其性能会有较大的提升。而对于numpy中的ndarrray,没有类似名称的函数实现相同功能,但是有一个numpy.frompyfunc函数,其可以对一个python函数进行封装,返回一个封装后的函数,然后可以利用返回的封装后的函数直接对ndarray进行操作,从而实现对ndarray中的每个元素实现相应的函数操作,这种方式相比于DataFrame的applymap函数,性能还有更进一步的提升。

numpy:利用np.frompyfunc函数实现元素级操作,类似pandas的applymap函数功能_第1张图片

       如上图所示,numpy.frompyfunc函数有三个参数,第一个参数为func,表示传入的python函数,nin表示func的输入的参数,nout表示func输出结果的个数。当func为输入为1输出也为1的函数时,即nin=1,nout=1时,这时func就是一个元素级操作函数,可以实现类似DataFrame的applymap函数的功能;但func还可以是多输入和输出的函数,因此numpy.frompyfunc函数的功能实际上更为强大。具体用法参考如下例子。

import numpy as np

arr=np.array([[1,2,3],[2,3,4]])
f1=np.frompyfunc(lambda x:x+1 if x<5 else x-1,1,1)
f2=np.frompyfunc(lambda x:(x+1,x-1),1,2)
f3=np.frompyfunc(lambda x,y:x+y,2,1)
f4=np.frompyfunc(lambda x,y:(x+y,x-y),2,2)

f1(arr)
# output:
# array([[2, 3, 4],
#        [3, 4, 5]], dtype=object)

f2(arr)
# output:
# (array([[2, 3, 4],
#         [3, 4, 5]], dtype=object), 
#  array([[0, 1, 2],
#         [1, 2, 3]], dtype=object))

f3(arr,arr)
# output:
# array([[2, 4, 6],
#        [4, 6, 8]], dtype=object)

f4(arr,arr)
# output:
# (array([[2, 4, 6],
#         [4, 6, 8]], dtype=object), 
#  array([[0, 0, 0],
#         [0, 0, 0]], dtype=object))

ar=np.array([1,2,3])
f4(arr,ar)
# output:
# (array([[2, 4, 6],
#         [3, 5, 7]], dtype=object), 
#  array([[0, 0, 0],
#         [1, 1, 1]], dtype=object))

       从上面例子中可以看到,nin参数即是func的输入参数的个数,同时也是返回的函数的参数个数,而且在返回的函数中的参数不一定的相同shape的,但shape必须兼容广播操作,如f4(arr,ar)语句所示。

你可能感兴趣的:(numpy,性能提升,数据分析)