Что такое "скаляр" в numpy?

В документации указано назначение скаляров, например, тот факт, что обычные номера Python, такие как float и integer, являются слишком примитивными, поэтому необходимы более сложные типы данных.

В нем также указаны некоторые виды скаляров (иерархия типов данных); а также пару атрибутов скаляра.
Но он никогда не дает конкретного определения того, что скаляр в контексте Python.

Я хочу понять суть проблемы. Поэтому мой вопрос в возможно более простых выражениях объясняет мне, что такое пифонический скаляр.

Ответ 1

Скаляр 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 содержит ссылку на исходный код.

Ответ 2

В этом контексте скаляр является одной из вещей, которые вы помещаете в массив. Например, один 64-битный float или 32-битный int, а не целый массив из них.

Ответ 3

Просто не-векторы. 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