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?
Любая помощь приветствуется.
Ответы
Ответ 1
Тип целочисленного значения по умолчанию np.int_
- C long:
http://docs.scipy.org/doc/numpy-1.10.1/user/basics.types.html
Но C long - int32 в win64.
https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx
Это своего рода странность платформы win64.
Ответ 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-битных поплавков может быть вполне существенным.