Numpy基础
NumPy的主要对象是存放同类型元素的多维数组,即所有的元素都是一种类型、通过一个正整数元组索引(通常元素是数字)。
例如,3维空间中一个点的坐标为[1, 2, 3],就是一个秩为1的数组,它只有一个轴,轴长度为3. 又如,在以下例子中,数组的秩为2(有两个维度), 第一个维度长度为2, 第二个维度长度为3.
[[ 1., 0., 0.],
[ 0., 1., 2.]]
NumPy的数组类被称作ndarray,简称为数组。
注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。更多ndarray对象属性有:
- ndarray.ndim: 数组轴的个数,在python的世界中,轴的个数被称作秩。
- ndarray.shape: 指示数组在每个维度上大小的整数元组。例如一个n行m列的矩阵,它的shape属性将是(n,m)。
- ndarray.size: 数组元素的总个数,等于shape属性元组中元素的乘积。
- ndarray.dtype: 描述数组中元素类型。
- ndarray.itemsize: 数组中每个元素的字节大小。
例:
>>> import numpy as np
>>> a = np.arange(15).reshape(3,5)
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int32'
>>> a.itemsize
4
>>> a.size
15
>>> type(a)
<class 'numpy.ndarray'>
>>> b = np.array([6,7,8])
>>> b
array([6, 7, 8])
>>> type(b)
<class 'numpy.ndarray'>
创建数组
提供多种创建数组的方法。
>>> import numpy as np
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int32')
>>> b = np.array([1.2,3.5,5.1])
>>> b.dtype
dtype('float64')
数组将两层序列嵌套转化成二维的数组,三层序列嵌套转化成三维数组。数组类型可以在创建时显示指定。
>>> b = np.array([(1.5,2,3),(4,5,6)])
>>> b
array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])
>>> c = np.array([[1,2],[3,4]],dtype=complex)
>>> c
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
通常,初始化时只能确定数组的大小,具体元素未知。因此,NumPy提供了使用占位符创建数组的函数。
函数 zeros() 创建全 0 数组,函数 ones() 创建全 1 数组,函数 empty() 创建一个内容随机数组。
>>> np.zeros((3,4))
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
>>> np.ones((2,3,4),dtype='int16')
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]], dtype=int16)
>>> np.empty((2,3))
array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])
创建一个数列,NumPy提供一个类似arange的函数返回数组:
>>> np.arange(10,30,5)
array([10, 15, 20, 25])
>>> np.arange(0,2,0.3)
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
打印数组
当你打印一个数组,NumPy以类似嵌套列表的形式显示它,但是呈以下布局:
一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。
>>> a = np.arange(6)
>>> print(a)
[0 1 2 3 4 5]
>>> b = np.arange(12).reshape(4,3)
>>> print(b)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
>>> c = np.arange(24).reshape(2,3,4)
>>> print(c)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
如果一个数组太大了,NumPy自动省略中间部分而只打印头尾。
>>> print(np.arange(10000))
[ 0 1 2 ..., 9997 9998 9999]
>>> print(np.arange(10000).reshape(100,100))
[[ 0 1 2 ..., 97 98 99]
[ 100 101 102 ..., 197 198 199]
[ 200 201 202 ..., 297 298 299]
...,
[9700 9701 9702 ..., 9797 9798 9799]
[9800 9801 9802 ..., 9897 9898 9899]
[9900 9901 9902 ..., 9997 9998 9999]]
禁用NumPy的这种行为并强制打印整个数组,可以设置 printoptions参数来更改打印选项。
>>> set_printoptions(threshold='nan')
参考自微信公众号:机器学习算法与Python学习,收藏 | Numpy详细教程,2018年11月26日。