Создание массивов
См. также
Введение
Существует 5 основных механизмов для создания массивов:
- Преобразование из других структур Python (например, списков, кортежей)
- Встроенные объекты NumPy для создания массивов (например, arange, ones, zeros и т.д.)
- Чтение массивов с диска, как из стандартных, так и из пользовательских форматов
- Создание массивов из сырых байтов с использованием строк или буферов
- Использование специальных функций библиотек (например, random)
В данном разделе не рассматриваются способы копирования, объединения или иного расширения или изменения существующих массивов. Также не рассматривается создание массивов объектов или структурированных массивов. Оба этих вопроса рассматриваются в отдельных разделах.
Преобразование объектов Python, подобных массивам, в массивы NumPy
В общем случае числовые данные, организованные в структуру, похожую на массив, в Python, могут быть преобразованы в массивы с помощью функции array(). Наиболее очевидные примеры — списки и кортежи. Подробности об использовании функции array() см. в документации. Некоторые объекты могут поддерживать протокол массива и допускать преобразование в массивы таким образом. Простой способ узнать, может ли объект быть преобразован в массив NumPy с помощью array(), — просто попробовать это интерактивно и посмотреть, работает ли это! (Python-овский подход).
Примеры:
>>> x = np.array([2,3,1,0])
>>> x = np.array([2, 3, 1, 0])
>>> x = np.array([[1,2.0],[0,0],(1+1j,3.)]) # note mix of tuple and lists,
and types
>>> x = np.array([[ 1.+0.j, 2.+0.j], [ 0.+0.j, 0.+0.j], [ 1.+1.j, 3.+0.j]])
Встроенное создание массивов NumPy
NumPy предоставляет встроенные функции для создания массивов с нуля:
zeros(shape) создаёт массив, заполненный значениями 0, с заданной формой. По умолчанию используется тип данных float64.
>>> np.zeros((2, 3)) array([[ 0., 0., 0.], [ 0., 0., 0.]])
ones(shape) создаёт массив, заполненный значениями 1. Она идентична zeros во всех других аспектах.
arange() создаёт массивы с регулярно увеличивающимися значениями. Полную информацию о различных способах её использования см. в строке документации. Здесь будут приведены несколько примеров:
>>> np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(2, 10, dtype=float) array([ 2., 3., 4., 5., 6., 7., 8., 9.]) >>> np.arange(2, 3, 0.1) array([ 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])
Обратите внимание, что существует ряд тонкостей, касающихся последнего способа использования, о которых пользователь должен знать, описанных в строке документации arange.
linspace() создаёт массивы с заданным количеством элементов, равномерно распределённых между заданными начальными и конечными значениями. Например:
>>> np.linspace(1., 4., 6) array([ 1. , 1.6, 2.2, 2.8, 3.4, 4. ])
Преимущества этой функции создания в том, что можно гарантировать количество элементов и начальную и конечную точку, чего arange() обычно не делает для произвольных значений start, stop и step.
indices() создаёт набор массивов (склеенных в массив на один порядок выше), по одному на каждую размерность, при этом каждый представляет собой изменение в данной размерности. Пример лучше иллюстрирует, чем словесное описание:
>>> np.indices((3,3)) array([[[0, 0, 0], [1, 1, 1], [2, 2, 2]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]])
Это особенно полезно для вычисления функций нескольких измерений на регулярной сетке.
Чтение массивов с диска
Предположительно, это наиболее распространённый случай создания больших массивов. Подробности, конечно же, сильно зависят от формата данных на диске, поэтому этот раздел может только дать общие рекомендации по работе с различными форматами.
Стандартные двоичные форматы
Различные области имеют стандартные форматы данных массивов. Ниже перечислены те, для которых есть известные библиотеки Python для их чтения и возврата массивов NumPy (могут быть и другие, для которых возможно чтение и преобразование в массивы NumPy, поэтому проверьте также последний раздел).
HDF5: h5py FITS: Astropy
Примеры форматов, которые нельзя напрямую прочитать, но для которых несложно выполнить преобразование, — это форматы, поддерживаемые библиотеками, такими как PIL (способными читать и записывать многие форматы изображений, такие как jpg, png и т. д.).
Общие ASCII-форматы
Файлы с разделителями (CSV) широко используются (и являются вариантом экспорта и импорта для программ, таких как Excel). Существует множество способов чтения этих файлов в Python. В Python есть функции CSV, а также функции в pylab (часть matplotlib).
Более общие ASCII-файлы можно читать с помощью пакета io в scipy.
Пользовательские двоичные форматы
Существует множество подходов. Если формат файла относительно прост, то можно написать простую библиотеку ввода-вывода и использовать функцию numpy fromfile() и метод .tofile() для прямого чтения и записи массивов NumPy (однако следите за порядком байтов!). Если существует хорошая библиотека C или C++, которая считывает данные, её можно обернуть с помощью различных техник, хотя это, безусловно, более сложная задача и требует значительно более продвинутых знаний для взаимодействия с C или C++.
Использование специальных библиотек
Существуют библиотеки, которые могут использоваться для генерации массивов для специальных целей, и перечислить все их невозможно. Наиболее распространённые случаи — использование многочисленных функций генерации массивов в random для генерации массивов случайных значений и некоторых служебных функций для генерации специальных матриц (например, диагональных).
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/user/basics.creation.html