【问题标题】:Using numpy.vecotrize correctly正确使用 numpy.vectorize
【发布时间】:2018-11-07 10:42:15
【问题描述】:

我正在使用 np.vectorize 处理这段代码 sn-p

def to_homogenous(x):
'''
Convert a point x to homogenous coordinates.
'''
return np.hstack((x,np.array([1]))).flatten()

vec_to_homo = np.vectorize(to_homogenous)
coords = vec_to_homo([0,1])

这会导致以下错误:

ValueErrorTraceback(最后一次调用)
在 ()
----> 1 coords1 = vec_to_homo([0,1])

/home/lib/python2.7/site-packages/numpy/lib/function_base.pyc in 调用(self, *args, **kwargs)
第2753章 vargs.extend([kwargs[_n] for _n in names])
2754
-> 2755 返回 self._vectorize_call(func=func, args=vargs)
2756
第2757章

/home/lib/python2.7/site-packages/numpy/lib/function_base.pyc in _vectorize_call(self, func, args)
2832
2833 如果 ufunc.nout == 1:
-> 2834 res = 数组(输出,copy=False,subok=True,dtype=otypes[0])
第2835章:
2836 res = tuple([数组(x,copy=False,subok=True,dtype=t)

ValueError:使用序列设置数组元素。

我了解错误消息,但我终其一生都无法找到应该如何更改函数/调用矢量化来解决此问题。 如果我只传递一个整数,该函数会产生正确的结果,即vec_to_homo(0) 产生[0,1]

我的 sn-p 与上面链接的文档中提供的示例非常接近,所以我真的不明白出了什么问题。

请帮忙。
谢谢!

【问题讨论】:

  • 您没有说出您对vectorized 结果的期望。要使用返回数组的函数,vectorize 需要 otypes=[object]signature 参数。将标量以外的任何内容传递给您的函数需要signature。总的来说,vectorize 是一个笨拙的拐杖——偶尔有用,但很容易误用。

标签: python numpy vectorization


【解决方案1】:

您的问题与this question 相同。 np.vectorize 仅适用于将浮点数映射到浮点数的函数,而不适用于将浮点数映射到 Numpy 数组的函数。

此外,np.vectorize 不会加快代码执行速度。您可以在函数内部创建自己的逻辑来处理列表并使用理解、循环或类似方法返回二维数组。

【讨论】:

    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2021-11-05
    • 2020-02-29
    • 2018-08-05
    相关资源
    最近更新 更多