Python-Numpy多维数组 -- 字节交换, 副本, 视图

一、Numpy - 字节交换

我们已经看到,存储在计算机内存中的数据取决于 CPU 使用的架构。 它可以是小端(最小有效位存储在最小地址中)或大端(最小有效字节存储在最大地址中)。

1.numpy.ndarray.byteswap()函数在两个表示:大端和小端之间切换。

import numpy as np
a = np.array([1, 256, 8755], dtype = np.int16)
print '我们的数组是:'
print a
print '以十六进制表示内存中的数据:'
print map(hex,a)
# byteswap() 函数通过传入 true 来原地交换
print '调用 byteswap() 函数:'
print a.byteswap(True)
print '十六进制形式:'
print map(hex,a)
# 我们可以看到字节已经交换了
输出如下:
我们的数组是:[1 256 8755]
以十六进制表示内存中的数据:['0x1', '0x100', '0x2233']
调用 byteswap() 函数:[256 1 13090]
十六进制形式:['0x100', '0x1', '0x3322']

二、Numpy - 副本和视图

在执行函数时,其中一些返回输入数组的副本,而另一些返回视图。 当内容物理存储在另一个位置时,称为副本。 另一方面,如果提供了相同内存内容的不同视图,我们将其称为视图

1.无复制

简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。

此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。

demo

import numpy as np
a = np.arange(6)
print '我们的数组是:'
print a
print '调用 id() 函数:'
print id(a)
print 'a 赋值给 b:'
b = a
print b
print 'b 拥有相同 id():'
print id(b)
print '修改 b 的形状:'
b.shape = 3,2
print b
print 'a 的形状也修改了:'
print a
输出如下:
我们的数组是:[0 1 2 3 4 5]
调用 id() 函数:139747815479536
a 赋值给 b:[0 1 2 3 4 5]
b 拥有相同 id():139747815479536
修改 b 的形状:
[[0 1]
[2 3]
[4 5]]
a 的形状也修改了:
[[0 1]
[2 3]
[4 5]]

2.视图或浅复制

Numpy 拥有ndarray.view()方法,它是一个新的数组对象,并可查看原始数组的相同数据。 与前一种情况不同,新数组的维数更改不会更改原始数据的维数。

demo

import numpy as np
# 最开始 a 是个 3X2 的数组
a = np.arange(6).reshape(3,2)
print '数组 a:'
print a
print '创建 a 的视图:'
b = a.view()
print b
print '两个数组的 id() 不同:'
print 'a 的 id():'
print id(a)
print 'b 的 id():'
print id(b)
# 修改 b 的形状,并不会修改 a
b.shape = 2,3
print 'b 的形状:'
print b
print 'a 的形状:'
print a
输出如下:
数组 a:
[[0 1]
[2 3]
[4 5]]
创建 a 的视图:
[[0 1]
[2 3]
[4 5]]
两个数组的 id() 不同:
a 的 id():140424307227264
b 的 id():140424151696288
b 的形状:
[[0 1 2]
[3 4 5]]
a 的形状:
[[0 1]
[2 3]
[4 5]]

数组的切片也会创建视图:

demo

import numpy as np
a = np.array([[10,10], [2,3], [4,5]])
print '我们的数组:'
print a
print '创建切片:'
s = a[:, :2]
print s
输出如下:
我们的数组:
[[10 10]
[ 2 3]
[ 4 5]]
创建切片:
[[10 10]
[ 2 3]
[ 4 5]]

3.深复制

ndarray.copy()函数创建一个深层副本。 它是数组及其数据的完整副本,不与原始数组共享。

demo

​​​​​​

import numpy as np
a = np.array([[10,10], [2,3], [4,5]])
print '数组 a:'
print a
print '创建 a 的深层副本:'
b = a.copy()
print '数组 b:'
print b
# b 与 a 不共享任何内容
print '我们能够写入 b 来写入 a 吗?'
print b is a
print '修改 b 的内容:'
b[0,0] = 100
print '修改后的数组 b:'
print b
print 'a 保持不变:'
print a
输出如下:
数组 a:
[[10 10]
[ 2 3]
[ 4 5]]
创建 a 的深层副本:
数组 b:
[[10 10]
[ 2 3]
[ 4 5]]
我们能够写入 b 来写入 a 吗?False
修改 b 的内容:
修改后的数组 b:
[[100 10]
[ 2 3]
[ 4 5]]
a 保持不变:
[[10 10]
[ 2 3]
[ 4 5]

猜你喜欢

转载自blog.csdn.net/Odyssues_lee/article/details/85319022
今日推荐