Посмотреть на массив NumPy? - PullRequest
       15

Посмотреть на массив NumPy?

84 голосов
/ 06 декабря 2010

У меня есть массив 2D numpy. Есть ли способ создать представление, включающее первые k строки и все столбцы?

Смысл в том, чтобы избежать копирования базовых данных (массив настолько велик, что создание частичных копий невозможно).

1 Ответ

214 голосов
/ 07 декабря 2010

Конечно, просто индексируйте его, как обычно.Например, y = x[:k, :] Это вернет представление в исходный массив.Данные не будут скопированы, и любые обновления, сделанные в y, будут отражены в x и наоборот.


Редактировать:

Я обычно работаю с> 10 ГБ 3D-массивамииз uint8, так что я очень беспокоюсь об этом ... Numpy может быть очень эффективным в управлении памятью, если вы помните несколько вещей.Вот несколько советов, как избегать создания копий массивов в памяти:

Используйте +=, -=, *= и т. Д., Чтобы избежать копирования массива.Например, x += 10 изменит массив на месте, а x = x + 10 сделает копию и изменит ее.(также посмотрите на цифра * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 '* * 10' * 10 * 10 * * * * * * * * * * * * * * * * * '' 10 * * 'приведен к массиву с плавающей запятой, если это еще не было.Однако x += 10.0, где x - целочисленный массив, приведет к тому, что 10.0 будет приведен к типу int с той же точностью, что и массив.

Кроме того, многие функции numpy принимают параметр out, поэтому вы можете делать такие вещи, как np.abs(x, x), чтобы получить абсолютное значение x на месте.


Asвторое редактирование, вот еще несколько советов по представлениям против копий с массивами numpy:

В отличие от списков python, y = x[:] не возвращает копию, она возвращаетвид.Если вы хотите получить копию (которая, разумеется, удвоит объем используемой памяти), используйте y = x.copy()

Вы часто будете слышать о «причудливой индексации» массивов-пустышек.Использование списка (или целочисленного массива) в качестве индекса - это «необычная индексация».Это может быть очень полезно, но копирует данные.

В качестве примера: y = x[[0, 1, 2], :] возвращает копию, а y = x[:3,:] возвращает представление.

Даже действительно сумасшедшее индексирование, такое как x[4:100:5, :-10:-1, None], является "нормальным" индексированием и, тем не менее, возвращает представление, поэтому не бойтесь использовать все виды трюков срезов на больших массивах.

x.astype(<dtype>) вернет копию данных в качестве нового типа, а x.view(<dtype>) вернет представление.

Будьте осторожны с этим, однако ... Это чрезвычайно мощный и полезный, но вам нужно понять, как основные данные хранятся в памяти.Если у вас есть массив чисел с плавающей точкой, и вы рассматриваете их как целые числа (или наоборот), numpy будет интерпретировать базовые биты массива как целые.

Например, это означает, что 1.0 как 64-битное число с плавающей точкой в ​​системе с прямым порядком байтов будет 4607182418800017408 при просмотре как 64-битное целое, и массив [ 0, 0, 0, 0, 0, 0, 240, 63] при просмотре как uint8.Это действительно хорошо, когда вам нужно сделать что-то вроде бит-твидлинга на больших массивах, хотя ... У вас низкий контроль над тем, как интерпретируется буфер памяти.

...