Форум сайта python.su
Редко работал с 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])
Офлайн
у вас в numpy.array целые числа.
>>> m.dtype
dtype('int64')
Офлайн
Вы меня не поняли… меня удивило подобное поведение:
>>> m + 0.3
array([ 1.3, 2.3, 3.3, 4.3])
>>> m[1] = m[1] + 0.4
>>> m
array([1, 2, 3, 4])
Отредактировано (Май 8, 2010 22:50:04)
Офлайн
Тогда позвольте мне расписать все немного подробней.
numpy.array - фабричная функция, удобный способ создавать ndarray объекты.
Если dtype не указан - считается минимально необходимый. Т.е. если все ячейки целые - будет целый тип. Если среди них есть float - float. Попадется complex - тип ячейки будет комплексный.
При создании массива все ячейки преобразовываются к этому типу.
Присваивание ячейки тип массива не изменяет. Если ячейке целого массива присваивается число с плавающей точкой, оно сначала преобразуется к целому типу, что вы и видите.
При создании нового массива его тип вычисляется заново.
m + 0.3 создает новый массив. float перекрывает int, поэтому тип ячейки этого массива будет float.
Дальше считаем содержимое, складывая в данном случае.
Никакой магии.
Отредактировано (Май 9, 2010 00:05:44)
Офлайн
Спасибо, больне-менее понятно, просто сбило с толку то, что например имея список где каждый элемент 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'>
>>>
Офлайн
list - гетерогенный контейнер. Если по русски, то каждый элемент списка может иметь свой собственный тип.
Массивы же в numpy имеют один тип на все ячейки.
Кстати, можно писать numpy.array(, float) чтобы обойти ваше затруднение.
Офлайн
Андрей СветловНаверное, честнее было бы бросать исключение. Тогда бы и вопросов таких не было.
Присваивание ячейки тип массива не изменяет. Если ячейке целого массива присваивается число с плавающей точкой, оно сначала преобразуется к целому типу, что вы и видите.
Никакой магии.
Офлайн
Андрей СветловДа, в этом получается и кроется суть проблемы.=(( Не знаю как насчёт исключения, но не очень интуитивное поведение на мой взгляд, хотя наверное если бы я пользовался numpy, то вероятно знал бы такие вещи и глупых вопросов не возникало.
Массивы же в numpy имеют один тип на все ячейки.
Отредактировано (Май 9, 2010 14:28:47)
Офлайн
Пожалуйста.
Такое поведение - цена скорости при цифровых операциях.
Офлайн