Разница между псевдонимами, глубокими копиями и мелкими копиями, относящимися к numpy - PullRequest
0 голосов
/ 19 декабря 2018
from numpy import *
arr1=array([1,2,3])
arr2=arr1 #aliasing
arr3=arr1.view() #shallow copy
arr4=arr1.copy() #deep copy
id(arr1) #120638624
id(arr2) #120638624
id(arr3) #120639004
id(arr4) #123894390

Я знаю о мелком и глубоком копировании, как в C, C ++, но что это происходит в python?

Посмотрите код C ++.это то же самое происходит?

int main()
{
     int arr[]={1,2,3};
     int (&a)[3]=arr;//aliasing
     int* b=arr;// shallow copy
     int c[3];//deep copy
     int i;
     for(i=0;i<3;i++)
            c[i]=arr[i];
 }

1 Ответ

0 голосов
/ 19 декабря 2018

Вы имеете право на псевдоним и глубокое копирование (хотя копирование значений массива в for -петле обычно не считается хорошим способом сделать это).

С другой стороны, Numpy viewне указательЭто намного более тяжелая вещь, и сам по себе экземпляр объекта.Концептуально, это самая близкая вещь к фактическому указателю на массив, который существует в Python (хотя семантика, конечно, различна) и может выполнять некоторые из тех же ролей в вашем коде.Представление никогда не будет таким же производительным, как необработанный указатель, так как представление должно содержать набор данных, таких как форма и шаг, которые могут отличаться от данных его «родительского» массива.

Вклс другой стороны, массивы и представления Numpy обертывают __array_interface__, который, в свою очередь, оборачивает указатель на базовый буфер, в котором хранятся фактические данные.Поэтому, когда вы создаете новое представление массива, вы в конечном итоге делаете правильную поверхностную копию базовых данных, поскольку вы создаете копию указателя на эти данные (хотя и через несколько уровней переноса и косвенного обращения).

...