Код: Выделить всё
import numpy as np
def f(x):
print(f"x is {x} and has type {type(x)}")
try:
print(f"x.dtype is {x.dtype}")
except AttributeError:
print("no dtype exists on x")
return x
Я обертываю его с помощью np.vectorize. Я звоню:
Код: Выделить всё
res = np.vectorize(f)(np.array([np.uint8(1)])) # res will be: array([1], dtype=uint8)
Код: Выделить всё
x is 1 and has type
x.dtype is uint8
x is 1 and has type
no dtype exists on x
После запуска функции для первого элемента она перебирает все элементы. Итак, он снова принимает первый элемент. Меня удивило то, что теперь первым элементом является значение int, а не значение numpy.uint8, как показано в третьей строке приведенного выше рисунка. (Этот: x равен 1 и имеет тип ).
Конечно, для int не существует dtype, потому что это не numpy dtype, а скаляр Python (вот почему 4-я строка означает, что dtype не существует для x).
Такое поведение не происходит, когда входной np.uint8(1) не является элементом np.array([]), но представляет собой список или даже не итерируемый объект. Эти две строки ниже:
Код: Выделить всё
res = np.vectorize(f)([np.uint8(1)]) # res: array([1], dtype=uint8)
res = np.vectorize(f)(np.uint8(1)) # res: array(1, dtype=uint8)
Код: Выделить всё
x is 1 and has type
x.dtype is uint8
x is 1 and has type
x.dtype is uint8
Почему np.vectorize преобразует элементы np.uint8 одномерного массива в int, но оставляет типы элементов списка неизменными?