Numpy array dtype подходит как int32 по умолчанию в Windows 10 64-разрядной машине

Я установил Anaconda 3 64 бит на свой ноутбук и написал следующий код в Spyder:

import numpy.distutils.system_info as sysinfo
import numpy as np
import platform

sysinfo.platform_bits 
platform.architecture()

my_array = np.array([0,1,2,3])
my_array.dtype

Вывод этих команд показывает следующее:

sysinfo.platform_bits 
Out[31]: 64

platform.architecture()
Out[32]: ('64bit', 'WindowsPE')

my_array = np.array([0,1,2,3])
my_array.dtype
Out[33]: dtype('int32')

Мой вопрос в том, что хотя моя система 64-разрядная, почему по умолчанию тип массива int32 вместо int64?

Любая помощь приветствуется.

Ответ 2

В Microsoft C даже в 64-разрядной системе размер типа long int составляет 32 бита. (См., Например, https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx.) Numpy наследует размер по умолчанию целого числа от компилятора C long int.

Ответ 3

Оригинальный плакат, Прана, задал очень хороший вопрос. "Почему целое по умолчанию установлено на 32-битное, на 64-битной машине?"

Насколько я могу судить, короткий ответ: "Потому что он был разработан неправильно". Кажется очевидным, что 64-разрядная машина должна по умолчанию определять целое число в любом ассоциированном интерпретаторе как 64-битное. Но, конечно, два ответа объясняют, почему это не так. Теперь все по-другому, поэтому я предлагаю это обновление.

Я заметил, что для CentOS-7.4 Linux и MacOS 10.10.5 (нового и старого), работающих под управлением Python 2.7.14 (с Numpy 1.14.0) (по состоянию на январь 2018 года), по умолчанию целое число теперь определяется как 64-битный. ( "My_array.dtype" в исходном примере теперь будет сообщать "dtype (" int64 ") на обеих платформах.

Использование 32-разрядных целых чисел в качестве значения по умолчанию в любом интерпретаторе может приводить к очень быстрым результатам, если вы выполняете целочисленную математику, поскольку этот вопрос указывал:

Использование значения numpy to square дает отрицательное число

Теперь появляется сообщение о том, что Python и Numpy были обновлены и пересмотрены (исправлено, можно утверждать), так что для того, чтобы реплицировать проблему, описанную в вышеупомянутом вопросе, вы должны явно определить массив Numpy как int32.

В Python на обеих платформах по умолчанию целое число выглядит как int64. Этот код работает на обеих платформах (CentOS-7.4 и MacOSX 10.10.5):

>>> import numpy as np
>>> tlist = [1, 2, 47852]
>>> t_array = np.asarray(tlist)
>>> t_array.dtype

dtype('int64')

>>> print t_array ** 2

[ 1 4 2289813904]

Но если мы сделаем t_array 32-битным целым числом, получим следующее, из-за вычисления целочисленного числа, свертывающего знаковый бит в 32-битном слове.

>>> t_array32 = np.asarray(tlist, dtype=np.int32)
>>> t_array32.dtype

dtype*('int32')

>>> print t_array32 ** 2

[ 1 4 -2005153392]

Причина использования int32 - это, конечно, эффективность. Есть несколько ситуаций (например, использование TensorFlow или других инструментов обучения машинам из нервной сети), где вы хотите использовать 32-битные представления (в основном, с плавающей точкой, конечно), поскольку увеличение скорости по сравнению с использованием 64-битных поплавков может быть вполне существенным.