Что такое "скаляр" в 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

Вы можете представить себе случаи, когда этот код выглядит лучше.

Другие вопросы по тегам