Numpy基础教程(1)

    xiaoxiao2024-12-23  6

    目录

     

    创建数组

    ndarray对象的属性

    索引和切片

    Numpy数组算术

    数组的转置和换轴

    通用函数


    创建数组

    除了使用mat方法创建matrix对象和array方法创建array对象,下面例举下其他方法创建数组。

    np.zeros(shape, dtype = float, order = 'C')

    创建指定大小的数组,数组元素以 0 来填充。

    np.empty(shape, dtype = float, order = 'C')

    用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组,数组的值是随机的。

    np.ones(shape, dtype = None, order = 'C')

    创建指定形状的数组,数组元素以 1 来填充。

    np.full(shape, fill_value, dtype=None, order='C')

    该方法用于生成大小为shape,全file_value的矩阵。

    np.eye(N, M=None, k=0, dtype=float, order='C')

    该方法用于生成大小为M*N的单位矩阵。参数N是行数,M是列数,默认M=N,k表示对角线1的偏移量。

    In [1]: np.eye(3,3) Out[1]: array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) In [2]: np.eye(3,3,k=1) Out[2]: array([[0., 1., 0.], [0., 0., 1.], [0., 0., 0.]])

    ​​​​​np.asarray(a, dtype = None, order = None)

    这个方法与np.array()方法一样,只是参数个数不同而已,常用于讲matrix对象转换为array对象。

    np..fromiter(iterable, dtype, count=-1)

    从可迭代对象中建立 ndarray 对象,返回一维数组。

    np.arange(start = 0, stop, step = 1, dtype)

    start默认是0,step默认是1。返回指定范围和步长的ndarray对象。

    np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

    该方法用于创建一个一维数组,数组是一个等差数列构成的。参数num是数组元素的个数,默认50;参数endpoint决定是否包含stop值;参数retstep决定是否显示间距。该方法的间距会尽可能的大。

    In [1]: np.linspace(1,5,2,retstep=True) Out[1]: (array([1., 5.]), 4.0) In [2]: np.linspace(1,5,2,retstep=True,endpoint=False) Out[2]: (array([1., 3.]), 2.0)

    np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

    该方法用于创建一个于等比数列,参数base是对log的底数;参数start表示序列的起始值为:base ** start;参数stop表示序列的终止值为:base ** stop。

    In [1]: np.logspace(0,9,10,base=2) Out[1]: array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])

    ndarray对象的属性

    属性说明ndarray.ndim秩,即轴的数量或维度的数量ndarray.shape数组的维度,对于矩阵,n 行 m 列ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值ndarray.dtypendarray 对象的元素类型ndarray.itemsizendarray 对象中每个元素的大小,以字节为单位ndarray.flagsndarray 对象的内存信息ndarray.realndarray元素的实部ndarray.imagndarray 元素的虚部ndarray.data包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

    我们可以直接修改shape属性来改变数组的shape,与 reshape 函数效果一样。

    索引和切片

    数组的切片是原数组的视图,对于切片对象的修改,会反映到原数组上。如果你只是想单纯显式复制一份数组,推荐使用array.copy()方法。

    import numpy as np arr = np.array([1,2,3,4,5]) arr1 = arr[3:] #array([4, 5]) arr1[:] = 0 arr #array([1, 2, 3, 0, 0]) arr2 = arr.copy() #array([1, 2, 3, 4, 5]) arr2[:] = 0 #array([0, 0, 0, 0, 0]) arr #array([1, 2, 3, 4, 5]) 基础索引

    ndarray 数组可以基于 0 - n 的下标进行索引,返回的是具体元素的值。

    In [1]: a Out[1]: matrix([[1, 2], [2, 3]]) In [2]: a[0,0] Out[2]: 1 整数数组索引

    通过指定行索引和列索引来同时取出多个元素。返回的维度大小取决于行索引(列索引)的维度大小,如下所示,行索引是一维的[0,1,2],则返回的结果也是一维的[1,4,2],返回的是a[0,1]、a[1,1]、a[2,2]这三个数组成的数组。

    In [1]: a = np.array(((1,2,3),(1,4,5),(5,4,2))) In [2]: a Out[2]: array([[1, 2, 3], [1, 4, 5], [5, 4, 2]]) In [3]: a[[0,1,2],[0,1,2]] Out[3]: array([1, 4, 2])

    下面示例的行索引维度为二,所以返回的是二维。

    In [1]: a = np.array(((1,2,3,5),(1,4,6,5),(5,4,3,2))) In [2]: a[[[0,1],[0,1]],[[2,3],[1,1]]] Out[2]: array([[3, 5], [2, 4]])

    你还可以只指定行索引,而忽略列索引,这样将对指定行的所有列元素取出来。

    In [1]: a = np.array(((1,2,3,5),(1,4,6,5),(5,4,3,2))) In [2]: a[[0,1]] Out[2]: array([[1, 2, 3, 5], [1, 4, 6, 5]]) 布尔索引

    布尔索引是通过将数组的下标用条件表达式来替代,返回条件为Ture的元素,故返回的结果是一维的。注意这里条件的取反使用~。Python关键字and和or对布尔数组并没有用,应使用&或|。

    In [1]: a Out[1]: array([[1, 2, 3, 5], [1, 4, 6, 5], [5, 4, 3, 2]]) In [2]: a[a >4] Out[2]: array([5, 6, 5, 5]) In [3]: a[~(a >4)] Out[3]: array([1, 2, 3, 1, 4, 4, 3, 2]) 切片

    数值的切片和列表的切片是一样的,唯一的区别就是数值可以是多维的,而对每个维度的限定是以逗号隔开。

    In [1]: a Out[1]: array([[1, 2, 3, 5], [1, 4, 6, 5], [5, 4, 3, 2]]) In [2]: a[0:1] Out[2]: array([[1, 2, 3, 5]]) In [3]: a[0,2:] Out[3]: array([3, 5])

    对于第一个维度行,如果不想对其做切片,不能省略,可以用...或:来占位,如下所示:

    In [1]: a Out[1]: array([[1, 2, 3, 5], [1, 4, 6, 5], [5, 4, 3, 2]]) In [2]: a[...,] Out[2]: array([[1, 2, 3, 5], [1, 4, 6, 5], [5, 4, 3, 2]]) In [3]: a[:,2] Out[3]: array([3, 6, 3]) In [4]: a[,5] File "<ipython-input-88-d0e440202029>", line 1 a[,5] ^ SyntaxError: invalid syntax

    对于第二个维度列,如果你想省略,可以直接不填。

    Numpy数组算术

    数组之所以重要是因为它允许你进行批量操作而无需任何for循环。Numpy用户称这种特性叫向量化。

    1. 任何两个同尺寸的数组之间的算数方式都应用了元素对应操作的方式。

    import numpy as np arr = np.array([1,2,3,4]) arr*arr #array([ 1, 4, 9, 16]) arr -arr #array([0, 0, 0, 0])

    2. 带有标量计算的算术操作,会把计算参数传递给数组的每一个元素。

    arr*2 #array([2, 4, 6, 8])

    3. 同尺寸的数组之间比较,会产生一个布尔值数组。

    arr = np.array([1,2,3,4]) arr1 = np.array([2,2,3,3]) arr == arr1 #array([False, True, True, False])

    数组的转置和换轴

    数组的转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容。数组拥有transponse方法和特殊的T属性进行转置。

    import numpy as np arr = np.arange(15).reshape((3,5)) /* array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) */ arr.T 或 arr.transpose() /* array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]]) */

    对于高于二维的数组,transponse方法可以接收包含轴编号的元组,用于置换轴,可支持多个轴交换。

    ndarray有一个swapaxes方法,该方法接收一对轴编号作为参数,并对轴进行调整用于重组数据,只支持两个轴交换。

    import numpy as np arr = np.arange(16).reshape((2,2,4)) /* array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) */ arr.transpose((1,0,2)) 或者 arr.swapaxes(1,0) /* array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]]) */

    通用函数

    通用函数,也可以称为ufunc,是一种在ndarray数据中进行逐元素操作的函数。通用函数可分为一元通用函数和二元通用函数。

    import numpy as np arr = np.arange(8).reshape((2,4)) /* array([[0, 1, 2, 3], [4, 5, 6, 7]]) */ np.sqrt(arr) /* array([[0. , 1. , 1.41421356, 1.73205081], [2. , 2.23606798, 2.44948974, 2.64575131]]) */ x = np.random.randn(8) array([-0.93131489, -0.49453729, -0.57471257, 0.27222773, 3.09210037, 1.30070564, -0.689972 , 1.7015398 ]) y = np.random.randn(8) array([-1.14355521, -1.07714762, -0.86314268, 0.04644867, -0.57504133, -0.56352821, 0.72239222, 0.89803925]) np.maximum(x,y) array([-0.93131489, -0.49453729, -0.57471257, 0.27222773, 3.09210037, 1.30070564, 0.72239222, 1.7015398 ])

    使用数组进行面向数组编程

    将条件逻辑作为数据操作

    numpy.where函数是三元表达式的向量化版本。该函数有三个参数,第一个是一个bool值数组,后面两个可以是标量或向量。当为True,选择第二个参数的值,否则选择第三个参数的值。

    import numpy as np arr = np.random.randn(3,3) array([[-0.69943268, 0.59761547, -0.33936636], [ 0.2146388 , 0.16762762, 0.20330484], [ 0.83699423, 0.44246455, -0.20510247]]) np.where(arr<0,0,arr) #将数组小于0的数置为0 array([[0. , 0.59761547, 0. ], [0.2146388 , 0.16762762, 0.20330484], [0.83699423, 0.44246455, 0. ]]) 数学和统计方法

    像mean、sum、cumsum等函数可以接收一个可选参数axis,用于计算给定轴向上的统计值。如sum(axis = 1)表示在列的方向上,对每行求和。

    布尔值数组的方法

    布尔值在数值计算上会被强制为1(True)和0(False),如下面的sum方法。

    import numpy as np arr = np.array([True,False,True,False]) arr.sum() #2

    对于布尔值数组,有两个非常有用的方法any和all,any检查数组中是否至少有一个True,而all检查是否每个值都是True。这个方法也适用于非布尔值数组,因为所有非0元素都会按True处理。

    import numpy as np arr = np.array([True,False,True,False]) arr.any() #True arr.all() #False 排序

    Numpy数组可以使用sort方法进行排序。

    import numpy as np arr = np.random.randn(5) #array([ 0.6887544 , 1.89534564, -0.50606733, 1.38259784, -0.81475966]) arr.sort() #array([-0.81475966, -0.50606733, 0.6887544 , 1.38259784, 1.89534564]) arr1 = np.random.randn(3,3) array([[-1.92777094, 1.07420293, -1.51616526], [-0.0293244 , 2.71201676, -0.06842536], [ 1.04100276, -0.88579533, -0.06523198]]) arr1.sort(1) array([[-1.92777094, -1.51616526, 1.07420293], [-0.06842536, -0.0293244 , 2.71201676], [-0.88579533, -0.06523198, 1.04100276]]) 唯一值与其他集合逻辑

    1.np.unique()

    返回数组中唯一值排序后形成的数组。

    import numpy as np arr = np.array([2,2,4,5,8,3,4]) np.unique(arr) #array([2, 3, 4, 5, 8])

    2. np.in1d()

    检查一个数组中的值是否在另一个数组中,并返回布尔值数组。

    import numpy as np arr = np.array([2,2,4,5,8,3,4]) arr1 = np.array([1,2,3]) np.in1d(arr,arr1) #array([ True, True, False, False, False, True, False])

    最新回复(0)