【问题标题】:Numpy Vectorize BehaviorNumpy 向量化行为
【发布时间】:2016-02-14 04:42:07
【问题描述】:

我正在尝试使用 numpy.vectorize 和这个 lambda 函数来 np.vectorize 一个单周期锯齿函数:

saw = lambda x: 0 if x < -2 or x > 2 else x

但是当我将向量化的saw 应用到这个数组时:

array([-4.    , -3.57894737, -3.15789474, -2.73684211, -2.31578947,
   -1.89473684, -1.47368421, -1.05263158, -0.63157895, -0.21052632,
    0.21052632,  0.63157895,  1.05263158,  1.47368421,  1.89473684,
    2.31578947,  2.73684211,  3.15789474,  3.57894737,  4.        ])

我明白了:

array([ 0,  0,  0,  0,  0, -1, -1, -1,  0,  0,  0,  0,  1,  1,  1,  0,  0,
    0,  0,  0])

这是怎么回事?

考虑到我正在使用 Python 2.7 和 numpy 1.10.2

【问题讨论】:

  • 请显示您用于生成此文件的所有相关代码。看起来您的数据正在以某种方式转换为整数。也许换成saw = lambda x: 0.0 if x &lt; -2 or x &gt; 2 else x
  • 注意:最好使用np.where 而不是np.vectorizenp.vectorize 真的很慢。
  • 在这种情况下,wherevectorize 快 2 倍。使用布尔掩码,我可以将其放大 3 倍。

标签: python numpy


【解决方案1】:

根据np.vectorize 文档:

输出类型是通过评估第一个元素来确定的 输入,除非指定

您的第一个输入元素产生int64 类型的输出:

In [2]: data = np.array([-4.    , -3.57894737, -3.15789474, -2.73684211, -2.31578947,
   ...:    -1.89473684, -1.47368421, -1.05263158, -0.63157895, -0.21052632,
   ...:     0.21052632,  0.63157895,  1.05263158,  1.47368421,  1.89473684,
   ...:     2.31578947,  2.73684211,  3.15789474,  3.57894737,  4.        ])

In [3]: saw = lambda x: 0 if x < -2 or x > 2 else x

In [4]: saw_v = np.vectorize(saw)

In [5]: type(saw_v(data)[0])
Out[5]: numpy.int64

In [6]: type(saw_v(data[5:])[0])
Out[6]: numpy.float64

在对函数进行矢量化时,您必须指定 otype

In [9]: saw_v_f = np.vectorize(saw, otypes=[np.float])

In [10]: type(saw_v_f(data)[0])
Out[10]: numpy.float64

In [11]: saw_v_f(data)
Out[11]: 
array([ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
       -1.89473684, -1.47368421, -1.05263158, -0.63157895, -0.21052632,
        0.21052632,  0.63157895,  1.05263158,  1.47368421,  1.89473684,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ])

【讨论】:

  • 只更改为saw = lambda x: 0.0 if x &lt; -2 or x &gt; 2 else x 会起作用吗?
【解决方案2】:

似乎对我有用的地图。

map(saw, x)

[0, 0, 0, 0, 0, -1.89473684, -1.47368421, -1.0526315799999999, -0.63157894999999997, -0.21052631999999999, 0.21052631999999999, 0.63157894999999997, 1.0526315799999999, 1.47368421, 1.89473684, 0, 0, 0, 0, 0]

【讨论】:

  • ...但 OP 使用的是 numpy。这不相关。
  • np.array(list(map(saw,x))) 与使用此示例数组的vectorize 一样快。 np.array([saw(i) for i in x]) 也是如此
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2021-05-31
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多