numpy.vectorize
接受函数f:a->b并将其转换为g:a[]->b[]。
当a
和b
是标量时,这很好用,但我想不出为什么它不能将b用作ndarray
或list,即f:a->b[]和g:a[]->b
例如:
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))
这会产生以下结果:
array([[ 0. 0. 0. 0. 0.],
[ 1. 1. 1. 1. 1.],
[ 2. 2. 2. 2. 2.],
[ 3. 3. 3. 3. 3.]], dtype=object)
好的,这给出了正确的值,但是错误的数据类型。更糟的是:
g(a).shape
收益率:
(4,)
所以这个数组几乎是无用的。我知道我可以把它转换成:
np.array(map(list, a), dtype=np.float32)
给我我想要的:
array([[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.],
[ 2., 2., 2., 2., 2.],
[ 3., 3., 3., 3., 3.]], dtype=float32)
但这既不是有效的,也不是pythonic式的。你们谁能找到一种更干净的方法来做这件事?
提前感谢!
发布于 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
,它以您所希望的方式工作。
发布于 2017-10-21 13:11:58
1.12.0中的一个新参数signature
完全可以做你想做的事情。
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。
发布于 2014-07-24 13:07:47
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可以更全面、更好地解决这个问题(我相信)。希望这能有所帮助。
https://stackoverflow.com/questions/3379301
复制相似问题