Что такое "скаляр" в NumPy?
В документации указывается назначение скаляров, например, тот факт, что обычные числа Python, такие как float и integer, слишком примитивны, поэтому более сложные типы данных являются необходимыми.
Также указываются определенные виды скаляров (иерархия типов данных); а также пара атрибутов скаляров.
Но он никогда не дает конкретного определения того, что скаляр в контексте Python.
Я хочу разобраться в этом вопросе. Таким образом, мой вопрос, в самых простых терминах, объясните мне, что такое питонический скаляр.
4 ответа
Скаляр NumPy - это любой объект, который является экземпляром np.generic
или чей type
в np.ScalarType
:
In [12]: np.ScalarType
Out[13]:
(int,
float,
complex,
long,
bool,
str,
unicode,
buffer,
numpy.int16,
numpy.float16,
numpy.int8,
numpy.uint64,
numpy.complex192,
numpy.void,
numpy.uint32,
numpy.complex128,
numpy.unicode_,
numpy.uint32,
numpy.complex64,
numpy.string_,
numpy.uint16,
numpy.timedelta64,
numpy.bool_,
numpy.uint8,
numpy.datetime64,
numpy.object_,
numpy.int64,
numpy.float96,
numpy.int32,
numpy.float64,
numpy.int32,
numpy.float32)
Это определение исходит из просмотра исходного кода для np.isscalar:
def isscalar(num):
if isinstance(num, generic):
return True
else:
return type(num) in ScalarType
Обратите внимание, что вы можете проверить, является ли что-то скалярным, используя np.isscalar
:
>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True
Как мы узнаем то, что знаем? Мне нравится узнавать, как люди знают то, что они знают - больше, чем сами ответы. Итак, позвольте мне попытаться объяснить, откуда пришел вышеуказанный ответ.
Наличие правильных инструментов может помочь вам понять такие вещи для себя.
Я выяснил это с помощью IPython. Используя его TAB-завершение, набрав
In [19]: import numpy as np
In [20]: np.[TAB]
заставляет IPython отображать все переменные в np
пространство имен модуля. Поиск строки "scalar"
приведет вас к np.ScalarType
а также np.isscalar
, Typing
In [20]: np.isscalar?
(обратите внимание на знак вопроса в конце) предлагает IPython, чтобы показать вам, где np.isscalar
определено:
File: /data1/unutbu/.virtualenvs/dev/lib/python2.7/site-packages/numpy/core/numeric.py
вот как я дошел до определения isscalar
, Кроме того, NumPy документация для isscalar
также есть ссылка на исходный код.
В этом контексте скаляр - это одна из вещей, которые вы помещаете в массив. Например, один 64-битный float или 32-битный int, а не целый их массив.
Просто не векторы. numpy пытается разобрать свои векторы в единичные числа (а именно, в скалярах Python) при передаче в качестве аргументов и потерпит неудачу, если длина вектора не равна 1:
In [44]: float(a)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-44-93d25633ffc4> in <module>()
----> 1 float(a)
TypeError: only length-1 arrays can be converted to Python scalars
Опираясь на ответ @unutbu...
Скаляр numpy обычно создается из «обычной» переменной Python. Как правило, вам, как пользователю, не о чем беспокоиться, и это просто работает. Однако в некоторых случаях может быть удобно привести числовое значение к скаляру.
Подумайте о том, чтобы добавить константу к обоим значениям массива:
[3, 4] + 5
Это не сработает. Ни один из этих типов не является numpy, и Python не знает, как выполнить эту операцию. Два способа выполнения этой операции:
np.array([3, 4]) + 5
...or...
[3, 4] + np.int32(5)
Использование второго синтаксиса может в некоторых случаях очистить ваш код:
bias = 5
np.array([3, 4, 6]) + bias
np.array([7, 4, 3]) + bias
...could become...
bias = np.int32(5)
[3, 4, 6] + bias
[7, 4, 3] + bias
Вы можете представить себе случаи, когда этот код выглядит лучше.