将Series传递给Numpy的exp()函数时,为什么会返回Series?

时间:2019-01-02 08:16:22

标签: python pandas numpy

除非将numpy本身编程为在将序列传递给它时返回一个序列,否则它会非常混乱。但是此函数上的documentation并没有提到将系列传递给它时,它会返回一个系列。

了解我来自Java背景,而我是python的新手。

2 个答案:

答案 0 :(得分:3)

NumPy ufunc机械具有内置的挂钩,以自定义ufunc如何处理对象。在这种特定情况下,numpy.exp ufunc调用Series的__array__方法来使用数组,计算该数组的指数,然后在结果上调用Series的__array_wrap__方法数组对其进行后处理。

__array__是ufunc如何获取它知道如何使用的对象,而__array_wrap__是结果如何转换为Series而不是数组。

通过使用这些方法编写自己的类,您可以看到相同的机制:

In [9]: class ArrayWrapper(object):
   ...:     def __init__(self, arr):
   ...:         self.arr = arr
   ...:     def __repr__(self):
   ...:         return 'ArrayWrapper({!r})'.format(self.arr)
   ...:     def __array__(self):
   ...:         return self.arr
   ...:     def __array_wrap__(self, arr):
   ...:         return ArrayWrapper(arr)
   ...:     

In [10]: numpy.exp(ArrayWrapper(numpy.array([1, 2, 3])))
Out[10]: ArrayWrapper(array([ 2.71828183,  7.3890561 , 20.08553692]))

答案 1 :(得分:1)

Series和ndarray对象之间的区别在于,Series对象允许您定义自己的带标签的索引,并使用该索引访问Series的元素,这些元素可以是字符串,浮点数,整数等,而ndarray对象具有从0开始的固定索引。 缺点是Series比ndarray慢大约10倍。

系列是熊猫的主要构建基块。系列表示基于NumPy ndarray的一维标记索引数组。像数组一样,Series可以容纳零个或多个任何单个数据类型的值。可以通过传递标量值,NumPy ndarray,Python列表或Python Dict作为Series构造函数的数据参数来创建和初始化Series。
有关更多信息,请参见pandas and NumPy arrays explained