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)
Хорошо, так что это дает правильные значения, но неправильный тип 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)
но это не является ни эффективным, ни питоновым. Может ли кто-нибудь из вас найти более чистый способ сделать это?
Спасибо заранее!