章节
数组副本是内容与原数组相同,存储在另一个内存位置的数组。
数组视图是由原数组生成的另一个数组,但是与原数组共享数组元素内存,是对同一个内存位置所存储数组元素的不同呈现。
数组引用是原数组的别名,与原数组是同一个数组。
数组赋值
NumPy中,把一个数组赋值给另一个数组,不会拷贝数组,赋值只是对原始数组的引用。对被赋值数组做的更改也会反映在原始数组中。
id()
函数返回数组的通用标识符,类似于C语言中的指针。
示例
import numpy as np
a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])
print("原始数组:")
print(a)
print('
')
print("数组a的ID:", id(a))
b = a
print("
赋值操作 b = a:")
print("
b的ID:",id(b))
b.shape = 4,3;
print("
b上的修改也反映到a上:")
print(a)
输出
原始数组:
[[ 1 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
数组a的ID: 140377691416656
赋值操作 b = a:
b的ID: 140377691416656
b上的修改也反映到a上:
[[ 1 2 3]
[ 4 9 0]
[ 2 3 1]
[ 2 3 19]]
ndarray.view()
view()
方法返回新的数组对象,但数组元素数据与原始数组共享,因此是浅拷贝。与前面的情况不同,新数组的维数更改不会影响原数组的维数。
示例
import numpy as np
a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])
print("原始数组:
",a)
print("
a的ID:",id(a))
b = a.view()
print("
b的ID:",id(b))
print("
打印b的view")
print(b)
b.shape = 4,3;
print("
b的维数更改不影响a")
print("
原始数组
",a)
print("
view
",b)
b[0, 0] = 100
print("
b的元素更改会影响a")
print("
原始数组
",a)
print("
view
",b)
输出
原始数组:
[[ 1 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
a的ID: 140249104167360
b的ID: 140249103376752
打印b的view
[[ 1 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
b的维数更改不影响a
原始数组
[[ 1 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
view
[[ 1 2 3]
[ 4 9 0]
[ 2 3 1]
[ 2 3 19]]
b的元素更改会影响a
原始数组
[[100 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
view
[[100 2 3]
[ 4 9 0]
[ 2 3 1]
[ 2 3 19]]
ndarray.copy()
copy()
返回原始数组的深层副本,该副本不与原始数组共享任何内存,是深拷贝。对数组副本所做的修改不会影响原始数组。
示例
import numpy as np
a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])
print("原始数组:
", a)
print("
a的ID:", id(a))
b = a.copy()
print("
b的ID:", id(b))
print("
打印b")
print(b)
b.shape = 4,3;
print("
b的维数更改不影响a")
print("
原始数组a
", a)
print("
数组副本b
", b)
b[0, 0] = 100
print("
b的元素更改不影响a")
print("
原始数组a
", a)
print("
数组副本b
", b)
输出
原始数组:
[[ 1 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
a的ID: 140312719819200
b的ID: 140312509357872
打印b
[[ 1 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
b的维数更改不影响a
原始数组a
[[ 1 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
数组副本b
[[ 1 2 3]
[ 4 9 0]
[ 2 3 1]
[ 2 3 19]]
b的元素更改不影响a
原始数组a
[[ 1 2 3 4]
[ 9 0 2 3]
[ 1 2 3 19]]
数组副本b
[[100 2 3]
[ 4 9 0]
[ 2 3 1]
[ 2 3 19]]