Уведомления

Группа в Telegram: @pythonsu

#1 Май 8, 2010 21:07:53

mem
От:
Зарегистрирован: 2009-10-25
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Numpy

Редко работал с Numpy, но тут наткнулся на такое:

>>> from numpy import *
>>> m = array([1,2,3,4])
>>> m
array([1, 2, 3, 4])
>>> type(m)
<type 'numpy.ndarray'>
>>> m + 0.3
array([ 1.3, 2.3, 3.3, 4.3])
>>> m[1] = m[1] + 0.4
>>> m
array([1, 2, 3, 4])
>>> m[1] = m[1] + 3
>>> m
array([1, 5, 3, 4])
WTF? Беглый поиск по докам ответа не дал..



Офлайн

#2 Май 8, 2010 22:42:52

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Numpy

у вас в numpy.array целые числа.

>>> m.dtype
dtype('int64')
сделайте array из float - можете к ним по 0.4 прибавлять без проблем



Офлайн

#3 Май 8, 2010 22:49:01

mem
От:
Зарегистрирован: 2009-10-25
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Numpy

Вы меня не поняли… меня удивило подобное поведение:

>>> m + 0.3
array([ 1.3, 2.3, 3.3, 4.3])

>>> m[1] = m[1] + 0.4
>>> m
array([1, 2, 3, 4])
То, что тип int64 я вкурсе. А сам массив я получаю из data фигуры в matplotlib, и собственно не я решаю какого он типа=).



Отредактировано (Май 8, 2010 22:50:04)

Офлайн

#4 Май 9, 2010 00:05:18

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Numpy

Тогда позвольте мне расписать все немного подробней.
numpy.array - фабричная функция, удобный способ создавать ndarray объекты.
Если dtype не указан - считается минимально необходимый. Т.е. если все ячейки целые - будет целый тип. Если среди них есть float - float. Попадется complex - тип ячейки будет комплексный.
При создании массива все ячейки преобразовываются к этому типу.
Присваивание ячейки тип массива не изменяет. Если ячейке целого массива присваивается число с плавающей точкой, оно сначала преобразуется к целому типу, что вы и видите.
При создании нового массива его тип вычисляется заново.
m + 0.3 создает новый массив. float перекрывает int, поэтому тип ячейки этого массива будет float.
Дальше считаем содержимое, складывая в данном случае.

Никакой магии.



Отредактировано (Май 9, 2010 00:05:44)

Офлайн

#5 Май 9, 2010 01:14:59

mem
От:
Зарегистрирован: 2009-10-25
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Numpy

Спасибо, больне-менее понятно, просто сбило с толку то, что например имея список где каждый элемент int мы получаем:

>>> lst = [1,2,3,4]
>>> lst[1] = lst[1] + 0.3
>>> lst
[1, 2.2999999999999998, 3, 4]
>>> type(lst[0])
<type 'int'>
>>>
>>> type(lst[1])
<type 'float'>
>>>
Привыкнув к такому поведению реализация numpy выглядит ошибочной.



Офлайн

#6 Май 9, 2010 02:52:20

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Numpy

list - гетерогенный контейнер. Если по русски, то каждый элемент списка может иметь свой собственный тип.
Массивы же в numpy имеют один тип на все ячейки.
Кстати, можно писать numpy.array(, float) чтобы обойти ваше затруднение.



Офлайн

#7 Май 9, 2010 10:43:34

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Numpy

Андрей Светлов
Присваивание ячейки тип массива не изменяет. Если ячейке целого массива присваивается число с плавающей точкой, оно сначала преобразуется к целому типу, что вы и видите.
Никакой магии.
Наверное, честнее было бы бросать исключение. Тогда бы и вопросов таких не было.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Май 9, 2010 14:28:31

mem
От:
Зарегистрирован: 2009-10-25
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Numpy

Андрей Светлов
Массивы же в numpy имеют один тип на все ячейки.
Да, в этом получается и кроется суть проблемы.=(( Не знаю как насчёт исключения, но не очень интуитивное поведение на мой взгляд, хотя наверное если бы я пользовался numpy, то вероятно знал бы такие вещи и глупых вопросов не возникало.
Проблему, обошёл конечно, но как говориться осадочек остался.
Всем спасибо.



Отредактировано (Май 9, 2010 14:28:47)

Офлайн

#9 Май 9, 2010 20:54:20

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Numpy

Пожалуйста.
Такое поведение - цена скорости при цифровых операциях.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version