Почему np.vectorize переводит элементы np.uint8 одномерного массива в int, но оставляет типы элементов списка неизменнымPython

Программы на Python
Anonymous
Почему np.vectorize переводит элементы np.uint8 одномерного массива в int, но оставляет типы элементов списка неизменным

Сообщение Anonymous »

У меня есть эта функция Python:

Код: Выделить всё

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
Он принимает значение, сообщает нам о его типе и атрибуте .dtype или об его отсутствии, а затем возвращает значение.
Я обертываю его с помощью 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
Я понимаю первые две строки. Прежде чем фактически выполнить функцию для каждого элемента входного массива, т. е. np.array([np.uint8(1)]), он берет первый его элемент (т.е. np.uint8(1)) и запускает функцию для проверки типа и размера вывода. Дополнительную информацию можно найти в этой теме или в документации.
После запуска функции для первого элемента она перебирает все элементы. Итак, он снова принимает первый элемент. Меня удивило то, что теперь первым элементом является значение 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, но оставляет типы элементов списка неизменными?

Вернуться в «Python»