首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在返回向量的函数上使用Numpy Vectorize

在返回向量的函数上使用Numpy Vectorize
EN

Stack Overflow用户
提问于 2010-08-01 02:20:10
回答 4查看 81.6K关注 0票数 51

numpy.vectorize接受函数f:a->b并将其转换为g:a[]->b[]。

ab是标量时,这很好用,但我想不出为什么它不能将b用作ndarray或list,即f:a->b[]和g:a[]->b

例如:

代码语言:javascript
复制
import numpy as np
def f(x):
    return x * np.array([1,1,1,1,1], dtype=np.float32)
g = np.vectorize(f, otypes=[np.ndarray])
a = np.arange(4)
print(g(a))

这会产生以下结果:

代码语言:javascript
复制
array([[ 0.  0.  0.  0.  0.],
       [ 1.  1.  1.  1.  1.],
       [ 2.  2.  2.  2.  2.],
       [ 3.  3.  3.  3.  3.]], dtype=object)

好的,这给出了正确的值,但是错误的数据类型。更糟的是:

代码语言:javascript
复制
g(a).shape

收益率:

代码语言:javascript
复制
(4,)

所以这个数组几乎是无用的。我知道我可以把它转换成:

代码语言:javascript
复制
np.array(map(list, a), dtype=np.float32)

给我我想要的:

代码语言:javascript
复制
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.,  3.]], dtype=float32)

但这既不是有效的,也不是pythonic式的。你们谁能找到一种更干净的方法来做这件事?

提前感谢!

EN

回答 4

Stack Overflow用户

发布于 2010-08-01 03:25:38

np.vectorize只是一个方便的函数。它实际上并不是make code run any faster。如果使用np.vectorize不方便,只需编写自己的函数,就可以随心所欲地工作。

np.vectorize的目的是将不支持numpy的函数(例如,接受浮点数作为输入,返回浮点数作为输出)转换为可以对numpy数组进行操作(并返回)的函数。

您的函数f已经支持numpy --它在其定义中使用了numpy数组,并返回一个numpy数组。所以np.vectorize并不适合你的用例。

因此,解决方案就是滚动您自己的函数f,它以您所希望的方式工作。

票数 60
EN

Stack Overflow用户

发布于 2017-10-21 13:11:58

1.12.0中的一个新参数signature完全可以做你想做的事情。

代码语言:javascript
复制
def f(x):
    return x * np.array([1,1,1,1,1], dtype=np.float32)

g = np.vectorize(f, signature='()->(n)')

然后g(np.arange(4)).shape会给(4L, 5L)

这里指定了f的签名。(n)是返回值的形状,()是标量参数的形状。参数也可以是数组。有关更复杂的签名,请参阅Generalized Universal Function API

票数 21
EN

Stack Overflow用户

发布于 2014-07-24 13:07:47

代码语言:javascript
复制
import numpy as np
def f(x):
    return x * np.array([1,1,1,1,1], dtype=np.float32)
g = np.vectorize(f, otypes=[np.ndarray])
a = np.arange(4)
b = g(a)
b = np.array(b.tolist())
print(b)#b.shape = (4,5)
c = np.ones((2,3,4))
d = g(c)
d = np.array(d.tolist())
print(d)#d.shape = (2,3,4,5)

这应该可以解决这个问题,并且无论您的输入大小是多少,它都可以正常工作。"map“只适用于一维输入。使用".tolist()“并创建一个新的ndarray可以更全面、更好地解决这个问题(我相信)。希望这能有所帮助。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3379301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档