一、Numpy概述
Numpy 是一个 Python 包(Numeric Python)。它是一个由多维数组对象和用于处理数组的集合组成的库。 Numpy 拥有线性代数和随机数生成的内置函数。Numpy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用。这种组合广泛用于替代 MatLab,是一个流行的技术计算平台。 但是,Python 作为 MatLab 的替代方案,现在被视为一种更加现代和完整的编程语言。NumPy 是开源的,这是它的一个额外的优势。使用Numpy,开发人员可以执行以下操作:
- 数组的算数和逻辑运算。
- 傅立叶变换和用于图形操作的例程。
- 与线性代数有关的操作。
二、Numpy - ndarray 对象
Numpy 中定义的最重要的对象是称为 ndarray
的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。ndarray
中的每个元素在内存中使用相同大小的块。 ndarray
中的每个元素是数据类型对象的对象(称为 dtype
)。
从ndarray
对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。 下图显示了ndarray
,数据类型对象(dtype
)和数组标量类型之间的关系。
ndarray
类的实例可以通过本教程后面描述的不同的数组创建例程来构造。 基本的ndarray
是使用 NumPy 中的数组函数创建的,如下所示:
numpy.array
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
上面的构造器接受以下参数:
序号 | 参数及描述 |
1. |
|
2. |
|
3. |
|
4. |
|
5. |
|
6. |
|
DEMO 1
import numpy as np
a = np.array([1,2,3])
print a
# 输出如下:[1, 2, 3]
DEMO 2
# 多于一个维度
import numpy as np
a = np.array([[1, 2], [3, 4]])
print a
# 输出如下:[[1, 2]
# [3, 4]]
DEMO 3
# 最小维度
import numpy as np
a = np.array([1, 2, 3,4,5], ndmin = 2)
print a
# 输出如下:[[1, 2, 3, 4, 5]]
DEMO 4
# dtype 参数
import numpy as np
a = np.array([1, 2, 3], dtype = complex)
print a
# 输出如下:[ 1.+0.j, 2.+0.j, 3.+0.j]
**ndarray ** 对象由计算机内存中的一维连续区域组成,带有将每个元素映射到内存块中某个位置的索引方案。 内存块以按行(C 风格)或按列(FORTRAN 或 MatLab 风格)的方式保存元素。
三、Numpy 的数据类型
Numpy 支持比 Python 更多种类的数值类型。
序号 | 数据类型及描述 |
1. |
|
2. |
|
3. |
|
4. |
|
5. |
|
6. |
|
7. |
|
8. |
|
9. |
|
10. |
|
11. |
|
12. |
|
13. |
|
14. |
|
15. |
|
16. |
|
17. |
|
18. |
|
19. |
|
Numpy 数字类型是dtype
(数据类型)对象的实例,每个对象具有唯一的特征。 这些类型可以是np.bool_
,np.float32
等。
四、数据类型对象 (dtype)
数据类型对象描述了对应于数组的固定内存块的解释,取决于以下方面:
- 数据类型(整数、浮点或者 Python 对象)
- 数据大小
- 字节序(小端或大端)
- 在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。
- 如果数据类型是子序列,它的形状和数据类型。
字节顺序取决于数据类型的前缀<
或>
。 <
意味着编码是小端(最小有效字节存储在最小地址中)。 >
意味着编码是大端(最大有效字节存储在最小地址中)。
dtype
可由以下语法构造:
numpy.dtype(object, align, copy)
# 参数为:
Object:被转换为数据类型的对象。
Align:如果为true,则向字段添加间隔,使其类似 C 的结构体。
Copy ? 生成dtype对象的新副本,如果为false,结果是内建数据类型对象的引用。
DEMO 1
# 使用数组标量类型
import numpy as np
dt = np.dtype(np.int32)
print dt
# 输出如下:int32
DEMO 2
#int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',以及其他。
import numpy as np
dt = np.dtype('i4')
print dt
# 输出如下:int32
DEMO 3
# 使用端记号
import numpy as np
dt = np.dtype('>i4')
print dt
# 输出如下:>i4
下面的例子展示了结构化数据类型的使用。 这里声明了字段名称和相应的标量数据类型。
DEMO 4
# 首先创建结构化数据类型。
import numpy as np
dt = np.dtype([('age',np.int8)])
print dt
# 输出如下:[('age', 'i1')]
DEMO 5
# 现在将其应用于 ndarray 对象
import numpy as np
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print a
# 输出如下:[(10,) (20,) (30,)]
DEMO6
# 文件名称可用于访问 age 列的内容
import numpy as np
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print a['age']
# 输出如下:[10 20 30]
DEMO 7
#以下示例定义名为 student 的结构化数据类型,其中包含字符串字段name,整数字段age和浮点字段marks。 #此dtype应用于ndarray对象。
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
print student
# 输出如下:[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')])
DEMO 8
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print a
# 输出如下:[('abc', 21, 50.0), ('xyz', 18, 75.0)]
每个内建类型都有一个唯一定义它的字符代码:
'b'
:布尔值'i'
:符号整数'u'
:无符号整数'f'
:浮点'c'
:复数浮点'm'
:时间间隔'M'
:日期时间'O'
:Python 对象'S', 'a'
:字节串'U'
:Unicode'V'
:原始数据(void
)
五、Numpy的数组属性
1.ndarray.shape这一数组属性返回一个包含数组维度的元组,它也可以用于调整数组大小。
DEMO1
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print a.shape
# 输出如下:(2, 3)
DEMO 2
# 这会调整数组大小
import numpy as np
a = np.array([[1,2,3],[4,5,6]]) a.shape = (3,2)
print a
# 输出如下:
[[1, 2]
[3, 4]
[5, 6]]
DEMO 3
NumPy 也提供了reshape
函数来调整数组大小。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print b
#输出如下:
[[1, 2]
[3, 4]
[5, 6]]
2.ndarray.ndim这一数组属性返回数组的维数。
DEMO 1
# 等间隔数字的数组
import numpy as np
a = np.arange(24) print a
# 输出如下:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
DEMO 2
# 一维数组
import numpy as np
a = np.arange(24) a.ndim
# 现在调整其大小
b = a.reshape(2,4,3)
print b
# b 现在拥有三个维度
# 输出如下:
[[[ 0, 1, 2][ 3, 4, 5]
[ 6, 7, 8][ 9, 10, 11]]
[[12, 13, 14][15, 16, 17]
[18, 19, 20][21, 22, 23]]]
3.numpy.itemsize这一数组属性返回数组中每个元素的字节单位长度。
DEMO 1
# 数组的 dtype 为 int8(一个字节)
import numpy as np
x = np.array([1,2,3,4,5], dtype = np.int8)
print x.itemsize
# 输出如下:1
DEMO 2
# 数组的 dtype 现在为 float32(四个字节)
import numpy as np
x = np.array([1,2,3,4,5], dtype = np.float32)
print x.itemsize
# 输出如下:4
4.numpy.flagsndarray对象拥有以下属性。这个函数返回了它们的当前值。
序号 | 属性及描述 |
1. |
|
2. |
|
3. |
|
4. |
|
5. |
|
6. |
|
DEMO
下面的例子展示当前的标志。
import numpy as np
x = np.array([1,2,3,4,5])
print x.flags
输出如下:
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
六、Numpy 的数组创建例程
新的ndarray
对象可以通过任何下列数组创建例程或使用低级ndarray
构造函数构造。
1.numpy.empty它创建指定形状和dtype的未初始化数组。 它使用以下构造函数:
numpy.empty(shape, dtype = float, order = 'C')
构造器接受下列参数:
序号 | 参数及描述 |
1. |
|
2. |
|
3. |
|
DEMO
下面的代码展示空数组的例子:
import numpy as np
x = np.empty([3,2], dtype = int)
print x
输出如下:
[[22649312 1701344351]
[1818321759 1885959276]
[16779776 156368896]]
注意:数组元素为随机值,因为它们未初始化。
2.numpy.zeros返回特定大小,以 0 填充的新数组。
numpy.zeros(shape, dtype = float, order = 'C')
构造器接受下列参数:
序号 | 参数及描述 |
1. |
|
2. |
|
3. |
|
DEMO1
# 含有 5 个 0 的数组,默认类型为 float
import numpy as np
x = np.zeros(5)
print x
输出如下:[ 0. 0. 0. 0. 0.]
DEMO 2
import numpy as np
x = np.zeros((5,), dtype = np.int)
print x
# 输出如下:[0 0 0 0 0]
DEMO3
# 自定义类型
import numpy as np
x = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
print x
输出如下:
[[(0,0)(0,0)]
[(0,0)(0,0)]]
3.numpy.ones返回特定大小,以 1 填充的新数组。
numpy.ones(shape, dtype = None, order = 'C')
构造器接受下列参数:
序号 | 参数及描述 |
1. |
|
2. |
|
3. |
|
DEMO 1
# 含有 5 个 1 的数组,默认类型为 float
import numpy as np
x = np.ones(5) print x
输出如下:[ 1. 1. 1. 1. 1.]
DEMO 2
import numpy as np
x = np.ones([2,2], dtype = int)
print x
输出如下:
[[1 1]
[1 1]]