Pull to refresh

Comments 26

Спасибо большое за перевод! Хоть и не совсем новичок в numpy — почитал с удовольствием.

Не знаю, как зайдёт новичкам — а мне прям освежило память)

Маленькие ремарки, которые я бы добавил:

Заполнение массива одинаковым значением.
>>> a = array([1, 2, 3], float)

Если новичок шёл последовательно по статье и импортировал numpy через классическое
import numpy as np — возникнет ошибка, не указана библиотека импортирования — np.array() — это единственный момент такой в статье.

Транспонировать матрицу можно и простым a.T — лаконичнее намного)

В остальном — отлично.
П.с.: может стоит подумать, как concatenate более по-русски перевести.
Буду ждать следующих статей!
Можно так и перевести: «конкатенация». Это распространённый и признанный термин даже в русскоязычной среде. Эдак и дезъюнкцию с конъюнкцией переводить, что ли?
Кстати, давным давно в институте нам пытались привить русский перевод как «сцепить», «сцепка», но… не /зашло, знаете ли.
UFO just landed and posted this here
Мне думается, что NumPy — это типа аббревиатуры от Number (Numerical) и Python, поэтому говорить но «numpy» для PHP не совсем корректно, тем более я так понимаю у numpy и numphp разные создатели и вообще не вижу пересечений.

UPD. А, вижу, вы и есть автор и вдохновлялись numpy, это многое объясняет :D
ага, именно так. вдохновлялся numpy. Сейчас пишу на пайтоне и очень радуюсь этой либе.
Поэтому была идея сделать аналог в базовом виде на php.

Если нужна библиотека общего назначения для работы с матрицами — Math.NET Numerics. Она может использовать для расчётов высокопроизводительную библиотеку Intel MKL. По функционалу близка к BLAS/LAPACK.

Обратите внимание, метод reshape создает новый массив, а не модифицирует оригинальный.

Это не совсем так. Если есть возможность (а это обычно именно так) создается новый view в те же самые данные. Ну то есть numpy-объект (мета-данные) действительно создается новый («старый массив не изменился»), но вот указывает он на тот же массив данных, копирования не происходит. Если изменить данные в одном из подобных view, то изменится и содержимое всех остальных view.

Можно кроме того явно потребовать reshape который будет in-place и гарантированно ничего не скопирует. Для этого достаточно просто присвоить новое значение аттрибуту .shape:

a.shape = (5,2)
Эти операции иногда полезны для сохранения большого количества данных в файлах

Для операций с файлами есть ndarray.save / ndarray.savez и ndarray.load а также .tofile / .fromfile — их и следует использовать. Для human-readable вариантов есть ndarray.savetxt и ndarray.loadtxt. Все эти методы гораздо полезнее и чаще используются чем .tostring. Кроме того .tostring вообще устарел, вместо него следует использовать .tobytes
Спасибо за статью. Единственное, чего мне в ней не хватает — это упоминания о type coercion в numpy-списках.
Я в конце цикла, от себя включу что-то, может. По комментам пособираю. Спасибо за замечание!
Поправьте, numpy.reshape возвращает view на массив если это возможно, а не копию. Этим как раз активно пользуются — без копирования менять представление данных для разных задач
Мне представляется что самое главное в numpy — возможность избежать медленного перебора элементов массива для выполнения операции над ним. За счет этого достигается скорость.

Также хорошо было отобразить тему numpy array vs python list. Именно ради numpy я познакомился с Питоном, и уже после массивов питоновские списки начали выглядеть алогичными )
С перебором элементов массива в numpy все забавно. Итерация по numpy-массиву работает часто медленнее чем если этот массив вначале преобразовать в список а затем итерировать список
for row in my_data:
  do_smthing(row) # slow
for row in my_data.tolist():
  do_smthing(row) # faster !!! 

Причина этого в том что при итерации по массиву надо создавать новые объекты row а при итерации по списку питон просто идет по уже лежащим в списке элементам. Создание же row-ов пачкой в методе .tolist() происходит сильно быстрее чем создании row-ов по одному при итерации :)
Вполне возможно, хотя это как раз тот способ который в numpy предпочли бы избежать )
Скорее всего для do_smthing() в numpy найдется функция, которая сделает все над массивом сразу )

Самое главное в numpy — это многомерные массивы и векторизованные математические операции над ними. В numpy чаще всего вы оперируете массивами, а не отдельными элементами. Часто циклы писать не надо вообще. :)

Раз уж тут кидают идеи автору статьи, то ловите еще одну: напишите про pandas.
Это очень классный фреймворк для работы со структурированными данными (таблицами) который шикарно интегрирован с numpy. Для обработки реальных данных в numpy он колоссально облегчает жизнь.
UFO just landed and posted this here
Спасибо за статью, но несколько уточнений по терминологии:

Метод shape возвращает количество строк и столбцов в матрице:
>>> a.shape

в том контексте как оно указано, здесь `shape` — это свойство (property), а не метод. Метод — это то, что вызывается со скобками: a.reshape((5, 2))

Метод in используется для проверки на наличие элемента в массиве:
>>> 2 in a

`in` — это не метод, а оператор.

>>> from numpy import *
Однако, этот вариант не приветствуется в программировании на python, так как убирает некоторые полезные структуры, которые модуль предоставляет

использовать «from XXX import *» просто опасно.
Sign up to leave a comment.

Articles