python函数如何处理numpy矩阵和标量?

时间:2017-04-17 07:52:37

标签: python function numpy matrix scalar

有一个简单的函数,它打算接受标量参数,但也适用于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上获得了不同的输出。有人可以解释一下吗?感谢。

2 个答案:

答案 0 :(得分:0)

fun的情况称为broadcasting

  

一般广播规则

     

在两个数组上运行时,NumPy会逐元素地比较它们的形状。它从尾随尺寸开始,并向前发展。

时兼容两个维度      
      
  1. 他们是平等的,或
  2.   
  3. 其中一个是1
  4.         

    如果不满足这些条件,则会抛出ValueError:frames未对齐的异常,表示阵列具有不兼容的形状。结果数组的大小是输入数组每个维度的最大大小。

答案 1 :(得分:0)

{{total_pages}}已经适用于标量和数组 - 因为元素分割是为两者(他们自己的方法)定义的。 fun根本不涉及fun(b),只是Python操作。

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

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

np.vectorize甚至1/c的工作原因是b/c,数组“知道”分裂。类似地,定义了数组乘法和加法:c1+c

我很想将此标记为

的副本

Python function that handles scalar or arrays