Python numpy 数组操作中“拷贝与引用”
2019-01-17 本文已影响20人
dopami
在C中操作有拷贝和引用两种,形如下:
int adder0(int a, int b)
{
a += 1;
b += 1;
return a+b;
}
int adder1(int* a, int* b)
{
*a += 1;
*b += 1;
return *a + *b;
}
int main()
{
int a = 0, b=2;
int sum0 = adder0(a,b);
int sum1 = adder1(&a,&b);
return 0;
}
adder0(a,b)就是拷贝a和b, 所以在执行完这一句的时候,主函数main中a b的值并不改变,改变的仅是调用函数中a b的副本
adder1(a,b)是引用操作,在执行的过程中,直接操作的是a b地址中所存的数a b,所以执行这句,main中a b均被加1.
#而在Python中 numpy操作是,同样也存在拷贝和引用操作的区别
import numpy as np
#假如定义了
arr1 = np.random.random((5,5,5,3)) #这样一个数组
arr2 = arr1[0:3,0:3] #arr2的shape为(3,3,5,3), arr2是arr1的子数组
#当这样操作时:
arr2 += 2 # arr2实际是arr1的引用,当改变arr2时,arr1对应的位置也会改变。
#当期望从arr1中取一部分数出来进行运算,而不改变arr1中原来的值,
#可使用如下语句:
arr2 = np.copy( arr1[0:3,0:3])
#这样arr2中就是arr1的一部分拷贝,操作arr2不会改变arr1