除非将numpy本身编程为在将序列传递给它时返回一个序列,否则它会非常混乱。但是此函数上的documentation并没有提到将系列传递给它时,它会返回一个系列。
了解我来自Java背景,而我是python的新手。
答案 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