LINUX.ORG.RU

Как numpy работает с массивами и скалярами?

 ,


0

2

Вот возьмём простую функцию numpy.sin. Если в качестве аргумента в неё передать array-like, то функция будет применена к каждому аргументу и на выходе будет numpy.array, если на вход передать скаляр, то на выходе будет скаляр. Как это внутри организовано? В моем дистрибутиве python в теле функции numpy.sin просто стоит pass. Как организовывать функции в питоне по вот такому принципу

if a.isscalar
 f(a)
else
 map(f,a)
?

★★★

Может так:

import collections

if isinstance(YourObject, collections.Iterable):
    print("Vector")
else:
    print("Scalar")

?

anonymous
()
Ответ на: комментарий от anonymous

Кхым. А как быть со строками в таком случае?

LIKAN ★★★
() автор топика
Ответ на: комментарий от anonymous

Можно использовать декоратор @numpy.vectorize перед def.

Если нужно не для numpy-массивов, то можно сделать свой декоратор, который будет проверять тип и использовать обычный map.

anonymous
()
Ответ на: комментарий от anonymous

Почти, но не то. Теперь функция, при передаче на вход скаляра возвращает массив из одного элемента, а должна возвращать скаляр.

LIKAN ★★★
() автор топика

Я вообще не питонист, но странно как то слышать такое. Разве этот Ваш скаляр не имеет специфических свойств, по которым можно однозначно идентифицировать этот тип (написать предикат)? Даже если так, в крайнем случае можно проманкипатчить его, добавив свойство, type = «scalar», и соответственно, написать предикат по этому свойству. Если патчить нативный тип нежедательно можно создать подтип, и работать с ним. Тривиальная же задача, не?

filequest
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.