Numpy / Pytorch dtype преобразование / совместимость - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь найти некоторую документацию, чтобы понять, как комбинируются dtypes. Например:

x : np.int32 = ...
y : np.float64 = ...
  • Что будет типом x + y?
  • зависит ли это от оператора (здесь +)?
  • это зависит от того, где он хранится (z = x + y против z[...] = x + y)?

Я ищу часть документации, которая описывает подобные сценарии, но пока я с пустыми руками.

1 Ответ

2 голосов
/ 07 мая 2019

Если типы данных не совпадают, то NumPy передаст данные в типы данных с более высокой точностью, если это возможно . И это не зависит от типа (арифметической) операции, которую мы выполняем, или от переменных, которые мы назначаем, если только эта переменная не имеет какой-либо другой тип dtype. Вот небольшая иллюстрация:

In [14]: x = np.arange(3, dtype=np.int32)
In [15]: y = np.arange(3, dtype=np.float64)

# `+` is equivalent to `numpy.add()`
In [16]: summed = x + y

In [17]: summed.dtype
Out[17]: dtype('float64')

In [18]: np.add(x, y).dtype
Out[18]: dtype('float64')

Если вы явно не назначите тип данных, то результат будет преобразован в более высокий тип данных заданных входных данных. Например, numpy.add() принимает dtype kwarg, где вы можете указать тип данных результирующего массива.


И можно проверить, могут ли два разных типа данных безопасно приводиться в соответствии с правилами приведения, используя numpy.can_cast()

Ради полноты добавлю следующую матрицу numpy.can_cast():

>>> def print_casting_matrix(ntypes):
...     ntypes_ex = ["X"] + ntypes.split()
...     print("".join(ntypes_ex))
...     for row in ntypes:
...         print(row, sep='\t', end=''),
...         for col in ntypes:
...             print(int(np.can_cast(row, col)), sep='\t', end='')
...         print()

>>> print_casting_matrix(np.typecodes['All'])

И выводом будет следующая матрица, которая показывает, какие dtypes можно безопасно привести (указано 1) и какие dtypes не могут быть преобразованы (указано 0), следуя порядку от приведения * От 1026 * (по оси-0) до до литья (по оси-1):

# to casting -----> ----->
X?bhilqpBHILQPefdgFDGSUVOMm
?11111111111111111111111101
b01111110000001111111111101
h00111110000000111111111101
i00011110000000011011111101
l00001110000000011011111101
q00001110000000011011111101
p00001110000000011011111101
B00111111111111111111111101
H00011110111110111111111101
I00001110011110011011111101
L00000000001110011011111101
Q00000000001110011011111101
P00000000001110011011111101
e00000000000001111111111100
f00000000000000111111111100
d00000000000000011011111100
g00000000000000001001111100
F00000000000000000111111100
D00000000000000000011111100
G00000000000000000001111100
S00000000000000000000111100
U00000000000000000000011100
V00000000000000000000001100
O00000000000000000000001100
M00000000000000000000001110
m00000000000000000000001101

Поскольку символы загадочны, мы можем использовать следующее для лучшего понимания приведенной выше матрицы приведения:

In [74]: for char in np.typecodes['All']:
    ...:     print(char, " --> ", np.typeDict[char])

И результат будет:

?  -->  <class 'numpy.bool_'>
b  -->  <class 'numpy.int8'>
h  -->  <class 'numpy.int16'>
i  -->  <class 'numpy.int32'>
l  -->  <class 'numpy.int64'>
q  -->  <class 'numpy.int64'>
p  -->  <class 'numpy.int64'>
B  -->  <class 'numpy.uint8'>
H  -->  <class 'numpy.uint16'>
I  -->  <class 'numpy.uint32'>
L  -->  <class 'numpy.uint64'>
Q  -->  <class 'numpy.uint64'>
P  -->  <class 'numpy.uint64'>
e  -->  <class 'numpy.float16'>
f  -->  <class 'numpy.float32'>
d  -->  <class 'numpy.float64'>
g  -->  <class 'numpy.float128'>
F  -->  <class 'numpy.complex64'>
D  -->  <class 'numpy.complex128'>
G  -->  <class 'numpy.complex256'>
S  -->  <class 'numpy.bytes_'>
U  -->  <class 'numpy.str_'>
V  -->  <class 'numpy.void'>
O  -->  <class 'numpy.object_'>
M  -->  <class 'numpy.datetime64'>
m  -->  <class 'numpy.timedelta64'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...