Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Использование NumPy для научных расчетов в Linux

Оригинал: How to use NumPy for scientific computing in Linux
Автор: Joshua Reed
Дата публикации: 3 ноября 2014 года
Перевод: А. Кривошей
Дата перевода: декабрь 2014 г.

Серьезные научные расчеты в Linux можно выполнять с помощью NumPy - научного пакета на базе Python с открытым исходным кодом, выпущенным под лицензией BSD, который представляет собой бесплатную, но мощную альтернативу проприетарным пакетам (таким как MATLAB). Многочисленные встроенные инструменты для анализа данных, обширная документация и детальные примеры делают NumPy идеальным пакетом для использования в научных вычислительных приложениях. В этом руководстве мы рассмотрим некоторые возможности NumPy для того, чтобы продемонстрировать ее мощь и простоту использования.

Возможности

NumPy предлагает обширную функциональность, которая включает (но не ограничивается!):

- Работа с многомерными массивами;
- Преобразование списков и кортежей Python в массивы NumPy (и наоборот);
- Импорт данных из текстовых файлов;
- Математические функции (арифметические, тригонометрические, экспоненциальные, логарифмические...);
- Распределения вероятностей;
- Статистические параметры (среднее, стандартное отклонение, гистограммы...);
- Преобразования Фурье;
- Линейная алгебра;
- Матрицы;
- Запись данных в текстовые файлы;
- Интеграция в существующие программы и скрипты на Python;

Преимущество NumPy над другими пакетами для научных вычислений с подобными лицензиями (такими как GNU Octave), заключается в том, что вы можете создавать приложения на Python, использующие возможности NumPy и всех других пакетов Python, обеспечивая вас огромным ассортиментом инструментов для решения самых разных задач. Кроме того, синтаксис NumPy унаследован от Python, что позволяет отказаться от синтаксиса в стиле MATLAB (используемого в GNU Octave) и применять свои навыки программирования на Python.

Установка

Для установки NumPy в Linux используйте следующие команды:

В Debian или Ubuntu:

$ sudo apt-get install python-numpy

В Fedora или CentOS:

$ sudo yum install numpy

У вас уже должен быть предварительно установлен Python (как правило, он установлен в системе по умолчанию).

Примеры использования NumPy

Ниже мы рассмотрим несколько примеров, демонстрирующих использование NumPy:

- Базовые операции с массивами;
- Импорт данных, разделенных запятыми, из текстового файла;
- Разбиение выборки равномерно распределенных данных.

В этих примерах мы будем использовать NumPy в командной строке интерактивной оболочки Python. Запустите ее с помощью команды "python" и затем импортируйте библиотеку numpy:

$ python

Python 2.7.3
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np

Пример 1: операции с массивами

Определим объект массива NumPy под именем "A", имеющий три строки, каждая из которых содержит три 32-битных целых числа. Выведем содержимое массива, введя его имя.

>>> A = np.array([[2, 2, 2], [4, 4, 4], [6, 6, 6]], np.int32)
>>> A
array([[2, 2, 2],
       [4, 4, 4],
       [6, 6, 6]], dtype=int32)

Определим второй объект массива NumPy под именем "B", имеющий три строки, каждая из которых содержит три 32-битных целых числа.

>>> B = np.array([[1, 1, 1], [5, 5, 5], [10, 10, 10]], np.int32)
>>> B
array([[ 1,  1,  1],
       [ 5,  5,  5],
       [10, 10, 10]], dtype=int32)

Определим третий массив как сумму двух предыдущих:

>>> C = A + B
>>> C
array([[ 3,  3,  3],
       [ 9,  9,  9],
       [16, 16, 16]], dtype=int32)

Найдем, какие из элементов третьего массива больше 10:

>>> C.__gt__(10)
array([[False, False, False],
       [False, False, False],
       [ True,  True,  True]], dtype=bool)

Пример 2: импорт разделенных запятой данных из текстового файла

Предположим, у нас есть файл data.txt со следующими данными:

1.0,2.0,3.0,4.0,5.0
600.0,700.0,800.0,900.0,1000.0

Вы можете вручную создать массив NumPy с этими данными, но при этом вам нужно будет самому ввести каждое значение. При работе с большими массивами данных такое решение не подходит. Данные, разделенные какими-либо символами можно без труда импортировать в массив NumPy.

Определим массив "D", содержащий данные из файла data.txt и укажем, что данные импортируются в виде 64-битных чисел с плавающей точкой, а разделителем служат запятые:

>>> D = np.loadtxt('data.txt', dtype=np.float64, delimiter=',')
>>> D
array([[    1.,     2.,     3.,     4.,     5.],
       [  600.,   700.,   800.,   900.,  1000.]])

Пример 3: разбиение выборки равномерно распределенных данных

Предположим, вы хотите сгенерировать 100 случайных чисел в диапазоне от 0.0 до 1.0, используя равномерное распределение вероятности (то есть любое значение в этом диапазоне появляется с одинаковой вероятностью). Это легко сделать с помощью приведенной ниже команды. Полученные числа будут храниться в массиве "Е".

>>> E = np.random.uniform(0.0, 1.0, 100)
>>> E
array([ 0.90319756,  0.39696831,  0.87253663,  0.2541832 ,  0.09188716,
        0.41019978,  0.87418001,  0.13551479,  0.60185788,  0.8717379 ,
        0.91012149,  0.9781284 ,  0.97365995,  0.95618329,  0.25079489,
        0.94314188,  0.92708129,  0.64377239,  0.27262929,  0.63310245,
        0.7315558 ,  0.53799042,  0.04425291,  0.1377755 ,  0.69068289,
        0.9929916 ,  0.56488252,  0.25588388,  0.81735705,  0.98430142,
        0.38541288,  0.81925846,  0.23941429,  0.9996938 ,  0.49898967,
        0.87731326,  0.41729317,  0.08407739,  0.09734557,  0.23217088,
        0.29291853,  0.09453821,  0.05676644,  0.97170175,  0.25987992,
        0.11203194,  0.68670969,  0.77228168,  0.85391461,  0.96315244,
        0.34276206,  0.8918815 ,  0.93095419,  0.33098585,  0.71910359,
        0.73351498,  0.20238829,  0.75232483,  0.12985561,  0.13185072,
        0.99842567,  0.78278125,  0.1550288 ,  0.03083502,  0.34190622,
        0.1755099 ,  0.67803282,  0.31715532,  0.29491133,  0.35878659,
        0.46047523,  0.27475024,  0.24985922,  0.5595999 ,  0.14831301,
        0.20137857,  0.79864609,  0.81361761,  0.22554692,  0.84947817,
        0.48316828,  0.8848909 ,  0.27639724,  0.02182878,  0.95491984,
        0.31427821,  0.6760356 ,  0.27305986,  0.73480237,  0.9581474 ,
        0.5614434 ,  0.12382754,  0.42856939,  0.69581633,  0.39598608,
        0.86023031,  0.59549305,  0.41717616,  0.70233037,  0.66019342])

Мы можем протестировать эти данные, используя инструмент histogram. Для полученных данных мы можем ожидать, что примерно 50% значений будут в диапазоне от 0.0 до 0.5, а оставшиеся 50% - в диапазоне от 0.5 до 1.0 (при условии, что мы задаем разбиение на два интервала, ограниченные нижним и верхним пределами 0.0 и 1.0 соответственно).

>>> np.histogram(E, bins=2, range=(0.0, 1.0))
(array([49, 51]), array([ 0. ,  0.5,  1. ]))

Утилита histogram подтвердила наши ожидания, показав, что 49 из 100 чисел (49%) лежат в первом интервале (от 0.0 до 1.0) и 51 из 100 (51%) - во втором интервале (от 0.5 до 1.0).

Заключение

В этом руководстве мы рассмотрели некоторые возможности пакета для научных вычислений NumPy и продемонстрировали на примерах простоту его использования. Документацию и дополнительные примеры можно найти на официальном сайте.