【问题标题】:How come when a Series is passed to Numpy's exp() function, a Series is returned?当 Series 传递给 Numpy exp() 函数时,为什么会返回一个 Series?
【发布时间】:2019-01-02 08:16:22
【问题描述】:

除非 numpy 本身被编程为在将 Series 传递给它时返回 Series,否则会非常混乱。然而,这个函数上的documentation 并没有提到当一个系列被传递给它时它会返回一个系列。

了解我来自 java 背景,我是 python 新手。

【问题讨论】:

  • np.exp 的输出是numpy.ndarray,甚至写在文档out : ndarray or scalar 中。澄清一下,你需要什么?
  • 很简单。你给它一个标量,它给你一个标量。你传给它一个长度为 n 的一维数组,它给你一个长度为 n 的一维数组。你传给它一个形状为 nxm 的数组,它给你一个形状为 nxm 的数组
  • @meW 当我期望一个 ndarray 或标量时,我很惊讶它返回了一个系列。但 user2357112 为我解释得很好。看来我在 python 中还有很长的路要走。

标签: python pandas numpy


【解决方案1】:

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

【讨论】:

  • 这正是我想知道的。谢谢你。你提到的 ufunc 东西对我来说很新。我应该学习什么才能对此有深入的了解?
  • @YosanGirma:文档的Special attributes and methods 部分涵盖了用于自定义对象如何与 ufunc 交互的大部分钩子。 NumPy 最重要的底层部分绝对是数组内存布局的工作原理。我不确定最好读什么,但文档中的this other section 看起来很合理。
  • 了解array indexing的各种形式的工作方式也很有用。
【解决方案2】:

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

系列是熊猫的主要组成部分。 Series 表示基于 NumPy ndarray 的一维标记索引数组。与数组一样,Series 可以保存任何单一数据类型的零个或多个值。可以通过传递标量值、NumPy ndarray、Python 列表或 Python Dict 作为 Series 构造函数的数据参数来创建和初始化 Series。
欲了解更多信息,请参阅pandas and NumPy arrays explained

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2013-12-21
    相关资源
    最近更新 更多