Numpy 的官网 https://numpy.org
Numpy的练习题 https://github.com/rougier/numpy-100
NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。 大多数提供科学计算的包都是用NumPy的阵列作为构建基础。
NumPy的主要对象是多维数组(multidimensional array)。 数组有时也翻译为阵列,它具有相同类型的元素(通常为数字),使用非负整数索引( index)。 在NumPy中维度称为轴(Axes)。
处理数据时,通常需要使用多维数组的方法,有时还必须对该数据应用一些基本的数学和统计运算,这正是NumPy定位的地方。 另外,针对大型n维数组也提供许多高级数学和统计运算支持。
NumPy的数组称为ndarray(N-dimensional array)。 请注意,numpy的array与Python库中的array不同,后者仅处理一维数组且功能较少。
这些ndarray是NumPy的本质,使它比使用Python的内置数组更快。 由于它们是同类型的,这意味着所有元素都必须是同一类型,因此数据具有一致性,这导致更少的内存浪费和更好的时间效率。
另外,NumPy数组具有「已定义」数据类型。 这意味着无法将字符串插入整数类型数组。 NumPy通常与双精度数据类型一起使用。
例如,一个简单的数组,3D空间中的点的坐标[1, 2, 4]只有一个轴。 该轴上有3个元素,所以我们说它的长度为3。 二维数组会有2个轴,例如第一个维度的轴长度为2,第二个维度的轴长度为3。 如下图所示例子:
[[ 1, 0, 0], [ 0, 1, 2]]
ndarray内容如下:
ndarray.ndim:数组的轴数,例如: 一维数组轴数为 1,二维数组轴数为 2,三维的数组轴数则为3。
ndarray.shape:数组的维度。 对于具有n 列(rows)与m 行(columns)的矩阵,shape是(n, m)。
ndarray.size:数组元素的总数,等于的元素的乘积。
ndarray.dtype:描述数组中元素的类型,例如:numpy.int32,numpy.int16和numpy.float64。
ndarray.itemsize:数组中每个元素的大小(以字节为单位)。 例如,类型为float64具有itemsize8(= 64/8),而类型为complex32具有itemsize4(= 32/8)。
ndarray.data:包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
1. 一个简单例子
>>> 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 # 32/8 4>>> a.size 15>>> type(a) <type 'numpy.ndarray'>
2. 创建数组
创建一维数组
>>> a = np.array([2, 3, 4]) >>> a array([2, 3, 4])>>> a.ndim 1>>> a.dtype dtype('int32')>>> b = np.array([1.2, 3.5, 5.1]) >>> b.dtype dtype('float64')
常见的错误
>>> a = np.array(1, 2, 3, 4) # WRONG >>> a = np.array([1, 2 ,3, 4]) # RIGHT
创建二维数组
>>> b = np.array([(1.5, 2, 3), (4, 5, 6)]) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]])>>> b.ndim 2>>> b.dtype dtype('float64')
数组的类型也可以在创建时明确指定:
>>> c = np.array( [[1, 2], [3, 4]], dtype=complex ) >>> c array([[ 1.+0.j, 2.+0.j], [ 3.+0.j, 4.+0.j]])
使用函数zeros会创建一个全零的数组,而函数ones则会创建全壹的数组。 默认情况下,创建的数组的dtype为 float64。
>>> np.zeros((3, 4)) array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]])# dtype can also be specified >>> np.ones((2, 3, 4), dtype=np.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)
为了创建数字序列,NumPy提供了类似于range的方法来返回数组而不是用数组的函数 。
使用函数arrange范围设定10 ~ 30,数值间隔为5,注意数组的输出并不包含最后的30。
>>> np.arange(10, 30, 5) array([10, 15, 20, 25])
也可以同时设定整数及浮点数的数值,最后格式都会转为浮点数格式。
# it accepts float arguments >>> np.arange( 0, 2, 0.3 ) array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])>>> d.dtype dtype('float64')
3. 打印数组
打印一维、二维及三组数组。
>>> a = np.arange(6) # 1d array >>> print(a) [0 1 2 3 4 5] >>> b = np.arange(12).reshape(4, 3) # 2d array >>> print(b) [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] >>> c = np.arange(24).reshape(2, 3, 4) # 3d array >>> 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]]]
4. 基本操作
>>> a = np.array([20, 30, 40, 50]) >>> a array([20, 30, 40, 50])>>> b = np.arange(4) >>> b array([0, 1, 2, 3])>>> c = a - b >>> c array([20, 29, 38, 47])>>> b**2 array([0, 1, 4, 9])>>> 10*np.sin(a) array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])>>> a < 35 array([ True, True, False, False])
与许多矩阵语言不同,乘积运算符*在NumPy数组中按元素进行操作。 可以使用@运算符(在python> = 3.5中)或dot函数执行矩阵乘积:
>>> a = np.array( [[1,1], ... [0,1]] )>>> b = np.array( [[2,0], ... [3,4]] )>>> a * b # elementwise product array([[2, 0], [0, 4]])>>> a @ b # matrix product array([[5, 4], [3, 4]])
某些操作,例如(+=)和(*=)会修改现有数组,而不是创建一个新的数组。
>>> a = np.ones((2, 3), dtype=int) array([[1, 1, 1], [1, 1, 1]])>>> b = ([1, 2, 3], [4, 5, 6])>>> a *= 3 >>> a array([[3, 3, 3], [3, 3, 3]])>>> b += a >>> b array([[4, 5, 6], [7, 8, 9]])
通过axis参数,指定axis=1为row运算,axis=0为column运算。
>>> a = np.arange(12).reshape(3,4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> a.sum(axis=0) # sum of each column array([12, 15, 18, 21]) >>> a.min(axis=1) # min of each row array([0, 4, 8])>>> a.mean(axis=0) # mean of each column array([4., 5., 6., 7.])>>> a.mean(axis=1) # mean of each row array([1.5, 5.5, 9.5])>>> a.cumsum(axis=1) # cumulative sum along each row array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]], dtype=int32)
5. 索引
一维数组的索引。
>>> a = np.arange(10)**3 >>> a array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]) # index( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)>>> a[2] 8>>> a[-1] 729>>> a[9] 729>>> a[2:5] array([ 8, 27, 64]) # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000 >>> a[:6:2] = -1000 >>> a array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])>>> a[ : :-1] # reversed a array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000])
多维数组每个轴可以有一个索引。
>>> def f(x, y): ... return 10*x + y >>> b = np.fromfunction(f, (5, 4), dtype=int) >>> b array([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33], [40, 41, 42, 43]])>>> b[3, 1] 31>>> b[-1, -1] 43>>> b[0:5, 1] # each row in the second column of b array([ 1, 11, 21, 31, 41])>>> b[ : , 1] # equivalent to the previous example array([ 1, 11, 21, 31, 41])>>> b[1:3, : ] # each column in the second and third row of b array([[10, 11, 12, 13], [20, 21, 22, 23]])>>>b[:2, :2] array([[ 0, 1], [10, 11]])
6. 筛选
筛选是一个非常强大的工具,如果要避免出现异常值,可以使用它来清理数据,对于更好地了解数据也很有帮助。
>>> a = np.arange(10)**3 >>> a array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])# values bigger than 10 >>> a[a > 10] array([ 27, 64, 125, 216, 343, 512, 729], dtype=int32) # alternative – values smaller than 3 >>>np.extract((a < 3), a) array([0, 1], dtype=int32)# values bigger 5 and smaller 10 >>>a[(a > 5) & (a < 10)] array([8], dtype=int32)# indices of values bigger than 5 (rows and cols) >>>np.where(a > 5) (array([2, 3, 4, 5, 6, 7, 8, 9], dtype=int64),)
7. 排序
对数据集的每一行进行排序非常有用。 使用NumPy,我们还可以对其他维度(例如row)进行排序。
>>> c = ([8,5,7],[5,3,2]) >>> c ([8, 5, 7], [5, 3, 2])>>>np.sort(c) # values sorted on last axis array([[5, 7, 8], [2, 3, 5]])>>>np.sort(c, axis=0) # values sorted on axis 0 array([[5, 3, 2], [8, 5, 7]])
以上这些就是Numpy的基础介绍。