【问题标题】:How can a python function handle both numpy matrix and scalar?python函数如何处理numpy矩阵和标量?
【发布时间】:2017-09-12 20:00:18
【问题描述】:

有一个简单的函数,它打算接受一个标量参数,但也适用于一个 numpy 矩阵。为什么函数fun 对矩阵有效?

>>> import numpy as np
>>> def fun(a):
      return 1.0 / a

>>> b = 2
>>> c = np.mat([1,2,3])
>>> c
matrix([[1, 2, 3]])

>>> fun(b)
0.5
>>> fun(c)
matrix([[ 1.        ,  0.5       ,  0.33333333]])

>>> v_fun = np.vectorize(fun)
>>> v_fun(b)
array(0.5)
>>> v_fun(c)
matrix([[ 1.        ,  0.5       ,  0.33333333]])

似乎fun 以某种方式被矢量化,因为显式矢量化函数v_fun 在矩阵c 上的行为相同。但是他们在标量b 上得到不同的输出。有人可以解释一下吗?谢谢。

【问题讨论】:

    标签: python function numpy matrix scalar


    【解决方案1】:

    fun 已经适用于标量和数组 - 因为为两者(它们自己的方法)定义了元素除法。 fun(b) 根本不涉及numpy,那只是一个 Python 操作。

    np.vectorize 旨在采用仅适用于标量的函数,并从数组中为其提供元素。在您的示例中,它首先将b 转换为数组np.array(b)。对于c 和修改后的b,结果是匹配大小的数组。 c 是一个 2d np.matrix,结果是一样的。注意fun(b)array 类型,而不是matrix

    这不是使用np.vectorize 的好例子,也不是广播的例子。 np.vectorize 是一个相当“简单”的函数,不以特殊方式处理标量。

    1/c 甚至 b/c 之所以有效,是因为 c,一个数组“知道”除法。类似地定义了数组乘法和加法:1+c2*c

    我很想将此标记为重复

    Python function that handles scalar or arrays

    【讨论】:

      【解决方案2】:

      fun 的情况称为broadcasting

      一般广播规则

      当对两个数组进行操作时,NumPy 会逐元素比较它们的形状。它从尾随维度开始,然后向前推进。两个维度兼容时

      1. 它们是相等的,或者
      2. 其中一个是 1

      如果不满足这些条件,则会抛出 ValueError: frames are not aligned 异常,表示数组的形状不兼容。结果数组的大小是输入数组每个维度上的最大大小。

      【讨论】:

      • 谢谢。帮了我很多忙。
      • “结果数组的大小是输入数组每个维度上的最大大小。” 这实际上有点不准确:np.zeros((1,0)) + np.zeros((3,1)) 给出了array([], shape=(3, 0), dtype=float64)。跨度>
      • np.vectorize 在使用 2 个或更多输入参数时会应用广播。但是这个函数只需要一个。
      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多