【发布时间】:2011-03-23 16:47:23
【问题描述】:
numpy.vectorize 接受一个函数 f:a->b 并将其转换为 g:a[]->b[]。
当a 和b 是标量时,这可以正常工作,但我想不出为什么它不能与 b 作为ndarray 或列表一起使用,即 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)
好的,这样给出了正确的值,但是错误的 dtype。更糟糕的是:
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。你们中的任何人都可以找到更清洁的方法吗?
提前致谢!
【问题讨论】:
-
它不能按预期工作的原因是你传递了
otypes=[np.ndarray]。所以你的结果是一个数组,其中的元素是数组,因此你得到dtype=object。你特地要求的。
标签: python arrays numpy vectorization