Найти - Пользователи
Полная версия: Numpy
Начало » Python для новичков » Numpy
1
mem
Редко работал с 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? Беглый поиск по докам ответа не дал..
Андрей Светлов
у вас в numpy.array целые числа.
>>> m.dtype
dtype('int64')
сделайте array из float - можете к ним по 0.4 прибавлять без проблем
mem
Вы меня не поняли… меня удивило подобное поведение:
>>> 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, и собственно не я решаю какого он типа=).
Андрей Светлов
Тогда позвольте мне расписать все немного подробней.
numpy.array - фабричная функция, удобный способ создавать ndarray объекты.
Если dtype не указан - считается минимально необходимый. Т.е. если все ячейки целые - будет целый тип. Если среди них есть float - float. Попадется complex - тип ячейки будет комплексный.
При создании массива все ячейки преобразовываются к этому типу.
Присваивание ячейки тип массива не изменяет. Если ячейке целого массива присваивается число с плавающей точкой, оно сначала преобразуется к целому типу, что вы и видите.
При создании нового массива его тип вычисляется заново.
m + 0.3 создает новый массив. float перекрывает int, поэтому тип ячейки этого массива будет float.
Дальше считаем содержимое, складывая в данном случае.

Никакой магии.
mem
Спасибо, больне-менее понятно, просто сбило с толку то, что например имея список где каждый элемент 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 выглядит ошибочной.
Андрей Светлов
list - гетерогенный контейнер. Если по русски, то каждый элемент списка может иметь свой собственный тип.
Массивы же в numpy имеют один тип на все ячейки.
Кстати, можно писать numpy.array(, float) чтобы обойти ваше затруднение.
PooH
Андрей Светлов
Присваивание ячейки тип массива не изменяет. Если ячейке целого массива присваивается число с плавающей точкой, оно сначала преобразуется к целому типу, что вы и видите.
Никакой магии.
Наверное, честнее было бы бросать исключение. Тогда бы и вопросов таких не было.
mem
Андрей Светлов
Массивы же в numpy имеют один тип на все ячейки.
Да, в этом получается и кроется суть проблемы.=(( Не знаю как насчёт исключения, но не очень интуитивное поведение на мой взгляд, хотя наверное если бы я пользовался numpy, то вероятно знал бы такие вещи и глупых вопросов не возникало.
Проблему, обошёл конечно, но как говориться осадочек остался.
Всем спасибо.
Андрей Светлов
Пожалуйста.
Такое поведение - цена скорости при цифровых операциях.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB