Конечно, просто индексируйте его, как обычно.Например, 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.Это действительно хорошо, когда вам нужно сделать что-то вроде бит-твидлинга на больших массивах, хотя ... У вас низкий контроль над тем, как интерпретируется буфер памяти.