HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: python, ndarray, numpy, prefetch, векторизация операций, resizing, slicing, array, ndarray.ndim, ndarray.shape</p>
1 <p>Теги: python, ndarray, numpy, prefetch, векторизация операций, resizing, slicing, array, ndarray.ndim, ndarray.shape</p>
2 <p>Многие знают, что<strong>Numpy</strong>классный и замечательный. А его<strong>ndarray</strong>позволяют не только удобно обращаться с данными, но также делают это крайне производительно. За счёт чего?</p>
2 <p>Многие знают, что<strong>Numpy</strong>классный и замечательный. А его<strong>ndarray</strong>позволяют не только удобно обращаться с данными, но также делают это крайне производительно. За счёт чего?</p>
3 <p>Для начала заметим, что<strong>ndarray</strong>не то же самое, что класс<strong>array</strong>стандартной библиотеки Python, который используется только для одномерных массивов.</p>
3 <p>Для начала заметим, что<strong>ndarray</strong>не то же самое, что класс<strong>array</strong>стандартной библиотеки Python, который используется только для одномерных массивов.</p>
4 <h2>Наиболее важные атрибуты объектов<strong>ndarray</strong>(выдернул с<a>Хабра</a>):</h2>
4 <h2>Наиболее важные атрибуты объектов<strong>ndarray</strong>(выдернул с<a>Хабра</a>):</h2>
5 <p><strong>ndarray.ndim</strong>- число осей (измерений) массива. В мире Python число измерений часто называют рангом.</p>
5 <p><strong>ndarray.ndim</strong>- число осей (измерений) массива. В мире Python число измерений часто называют рангом.</p>
6 <p><strong>ndarray.shape</strong>- размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из<em>"n"</em>строк и<em>"m"</em>столбов,<strong>shape</strong>будет (n,m). Число элементов кортежа<strong>shape</strong>равно рангу массива, то есть<strong>ndim</strong>.</p>
6 <p><strong>ndarray.shape</strong>- размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из<em>"n"</em>строк и<em>"m"</em>столбов,<strong>shape</strong>будет (n,m). Число элементов кортежа<strong>shape</strong>равно рангу массива, то есть<strong>ndim</strong>.</p>
7 <p><strong>ndarray.size</strong>- число всех элементов массива. Равно произведению всех элементов атрибута<strong>shape</strong>.</p>
7 <p><strong>ndarray.size</strong>- число всех элементов массива. Равно произведению всех элементов атрибута<strong>shape</strong>.</p>
8 <p><strong>ndarray.dtype</strong>- объект, описывающий тип элементов массива. Можно определить<strong>dtype</strong>, используя стандартные типы данных Python.<strong>NumPy</strong>здесь предоставляет целый букет возможностей, например:<strong>bool_, character, int_, int8, int16, int32, int64, float_, float8, float16, float32, float64, complex_, complex64, object_</strong>.</p>
8 <p><strong>ndarray.dtype</strong>- объект, описывающий тип элементов массива. Можно определить<strong>dtype</strong>, используя стандартные типы данных Python.<strong>NumPy</strong>здесь предоставляет целый букет возможностей, например:<strong>bool_, character, int_, int8, int16, int32, int64, float_, float8, float16, float32, float64, complex_, complex64, object_</strong>.</p>
9 <p><strong>ndarray.itemsize</strong>- размер каждого элемента массива в байтах. Например, для массива из элементов типа<strong>float64</strong>значение<strong>itemsize</strong>равно 8 (=64/8), а для<strong>complex32</strong>этот атрибут равен 4 (=32/8).</p>
9 <p><strong>ndarray.itemsize</strong>- размер каждого элемента массива в байтах. Например, для массива из элементов типа<strong>float64</strong>значение<strong>itemsize</strong>равно 8 (=64/8), а для<strong>complex32</strong>этот атрибут равен 4 (=32/8).</p>
10 <p><strong>ndarray.data</strong>- буфер, содержащий фактические элементы массива. Обычно нам не будет нужно использовать этот атрибут, потому как мы будем обращаться к элементам массива с помощью индексов.</p>
10 <p><strong>ndarray.data</strong>- буфер, содержащий фактические элементы массива. Обычно нам не будет нужно использовать этот атрибут, потому как мы будем обращаться к элементам массива с помощью индексов.</p>
11 <h2>Почему же ndarray так производительны?</h2>
11 <h2>Почему же ndarray так производительны?</h2>
12 <p>Дело, в том числе, в особенной структуре хранения данных. Обычные списки в Python хранят указатели на объекты, внутри которых есть указатели на их типы. Таким образом, чтобы прочитать что-то из списка нужно "скакать" по памяти.<strong>Numpy</strong>-массивы хранят указатель на кусок память, где лежат все данные, плюс метаинформацию об этих данных: типа, размерность и т.д. Тогда, при последовательном обращении к элементам массива эффективно используется кэш процессора, что позволяет снизить количество кэш-промахов, так как работает механизм предвыборки (<strong>prefetching</strong>).</p>
12 <p>Дело, в том числе, в особенной структуре хранения данных. Обычные списки в Python хранят указатели на объекты, внутри которых есть указатели на их типы. Таким образом, чтобы прочитать что-то из списка нужно "скакать" по памяти.<strong>Numpy</strong>-массивы хранят указатель на кусок память, где лежат все данные, плюс метаинформацию об этих данных: типа, размерность и т.д. Тогда, при последовательном обращении к элементам массива эффективно используется кэш процессора, что позволяет снизить количество кэш-промахов, так как работает механизм предвыборки (<strong>prefetching</strong>).</p>
13 <p>Также Numpy обеспечивает "векторизацию" операций над своими массивами. Он выполняет их на уровне С-кода, который, в свою очередь, использует структуру хранения, описанную выше, умнее.</p>
13 <p>Также Numpy обеспечивает "векторизацию" операций над своими массивами. Он выполняет их на уровне С-кода, который, в свою очередь, использует структуру хранения, описанную выше, умнее.</p>
14 <p><strong>Но и это еще не всё!</strong>Многие операции с массивами, такие как<strong>resizing</strong>,<strong>slicing</strong>и т.д., не копируют данные, на которые ссылается массив, а лишь изменяют хранящуюся рядом метаинформацию, обеспечивая другой<strong>view</strong>на те же самые данные.</p>
14 <p><strong>Но и это еще не всё!</strong>Многие операции с массивами, такие как<strong>resizing</strong>,<strong>slicing</strong>и т.д., не копируют данные, на которые ссылается массив, а лишь изменяют хранящуюся рядом метаинформацию, обеспечивая другой<strong>view</strong>на те же самые данные.</p>
15 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
15 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
16  
16