Numpy基础

Numpy基础

1、主要作用

​ 进行科学计算(支持矩阵和ndarray数组对象),内存连续(访问效率高), 支持并行运算,有两种存储风格(F风格—列优先存储, C风格—行优先存储)

2、数组基础

import numpy as np
arr = np.array(....) # 创建简单的数组
arr.size  # 4  数组中的元素个数
arr.itemsize # 数组中各个元素的占位大小
arr.dtype  # 数组中元素的数据类型
arr.ndim  # 数组的维度
arr.shape # 数组的形状, 元组形式返回, 返回的数据长度为数组的维度大小。

3、数组的创建

固定数组的创建

​ 1、使用array直接创建

import numpy as np

np.array()
arr = np.array([1,2,3,4,5])
print('arr:\n',arr)
print('arr:\n',type(arr))

输出结果:
arr:
 [1 2 3 4 5]
arr:
 <class 'numpy.ndarray'>

​ 2、使用arange来创建数组

# 参数1 : 开始位置 --包含开始位置
# 参数2: 结束位置---不包含结束位置
# 参数3: 步长
arr = np.arange(0, 10, 1)
arr = np.arange(10, dtype=np.float32)  # 当开始位置为0,并且步长为1,那么可以只指定结束值即可!
# arr = np.arange(0, 10, 2)
print('arr\n', arr)
print('arr\n', type(arr))  # <class 'numpy.ndarray'>

​ 3、使用linsapce来创建数组-----为等差数组

# 参数1:开始位置---包含开始位置
# 参数2 : 结束位置---包含结束位置
# 参数3 : 生成数组的元素的个数
# 参数 endpoint = True ---指的是包含结束位置
# 参数 dtype ---指定数据的类型
arr = np.linspace(0, 10, 6)
print('arr:\n', arr)
print('arr:\n', type(arr))

结果:
arr:
 [ 0.  2.  4.  6.  8. 10.]
arr:
 <class 'numpy.ndarray'>

​ 4、使用logspace创建数组-----为等比数组

# 参数1 ---开始位置
# 参数2 ---结束位置
# 参数3 ---生成数组的元素的个数
# 注意:参数1、2都针对的是指数
# 参数 base --就是底数
arr = np.logspace(0, 2, 3, base=10)
print('arr:\n', arr)
print('arr:\n', type(arr))

结果:
arr:
 [  1.  10. 100.]
arr:
 <class 'numpy.ndarray'>

​ 5、使用zeros创建数组-----为全为0的数组

# 参数shape ---生成数组的形状--元组
# 参数dtype ---元素的数据类型
arr = np.zeros(shape=(2,3),dtype=np.int32)
print('arr:\n',arr)
print('arr:\n',type(arr))

结果:
arr:
 [[0 0 0]
 [0 0 0]]
arr:
 <class 'numpy.ndarray'>

​ 6、使用ones创建数组-----为全为1的数组

# 参数shape ---生成数组的形状--元组
# 参数dtype ---元素的数据类型
arr = np.ones(shape=(2,3),dtype=np.int32)
print('arr:\n',arr)
print('arr:\n',type(arr))

结果:
arr:
 [[1 1 1]
 [1 1 1]]
arr:
 <class 'numpy.ndarray'>

​ 7、使用diag来创建数组----类似于对角矩阵,但可以控制偏移量

参数—对角线上的元素!!

k-----用来控制偏移量的,正往右上角偏移,负则往左下角偏移

arr = np.diag([1, 2, 3, 4])
print('arr:\n', arr)
print('arr:\n', type(arr))
结果:
arr:
 [[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]
arr:
 <class 'numpy.ndarray'>

添加 k参数

arr = np.diag([1, 2, 3, 4], k=1)
print('arr:\n', arr)
print('arr:\n', type(arr))
结果:
arr:
 [[0 1 0 0 0]
 [0 0 2 0 0]
 [0 0 0 3 0]
 [0 0 0 0 4]
 [0 0 0 0 0]]
arr:
 <class 'numpy.ndarray'>

​ 8、使用eye创建数组----类似于单位矩阵

# 参数--传递一个值,表示生成一个 参数*参数的 类似于单位矩阵的数组
arr = np.eye(3)
print('arr:\n', arr)
print('arr:\n', type(arr))
print('arr:\n', arr.dtype)
结果:
arr:
 [[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
arr:
 <class 'numpy.ndarray'>
arr:
 float64
随机数组的创建

​ 1、创建[0,1)内的均匀分布的数组
使用random.random创建
参数:可以是生成数组的元素个数 或者 是生成数组的形状!
arr = np.random.random(10) ------ 一维数组

arr = np.random.random((2,3))
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
 [0.66062123 0.78751191 0.54185441 0.32530977 0.47949264 0.12813448
 0.22498117 0.55217461 0.60248759 0.41519065]
arr:
 <class 'numpy.ndarray'>

使用random.rand创建数组
参数: 可以是生成数组的元素个数 或者 生成数组的行、列数!

arr = np.random.rand(10)
arr = np.random.rand(2,3,2)
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
 [[[0.27498811 0.1288612 ]
  [0.35329799 0.54618617]
  [0.98577679 0.32164269]]

 [[0.62686816 0.61702522]
  [0.11239757 0.48891016]
  [0.65602623 0.92886494]]]
arr:
 <class 'numpy.ndarray'>

​ 2、创建一个服从标准正态分布的数组random.randn

# 参数: 可以是生成数组的元素个数 或者 生成数组的行、列数!
# 创建一个服从标准正态分布的数组
arr = np.random.randn(10)
arr = np.random.randn(2,3)
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
 [[ 0.49355101 -0.11087639  0.07618425]
 [-0.2507126   1.22719261  0.57958796]]
arr:
 <class 'numpy.ndarray'>

​ 3、创建一个指定范围的随机整数数组random.randint

# 生成范围[low,high)
# size ---生成数组的形状!
arr = np.random.randint(low=0,high=10,size=(2,3))
print('arr:\n',arr)
print('arr:\n',type(arr))
结果:
arr:
 [[3 5 9]
 [3 6 6]]
arr:
 <class 'numpy.ndarray'>

​ 4、创建一个指定范围内的随机小数数组random.uniform

# 生成范围[low,high)
# 生成[low,high)的随机小数数组
arr = np.random.uniform(low=0.0, high=10.0, size=(2, 3))
print('arr:\n', arr)
print('arr:\n', type(arr))
结果:
arr:
 [[7.25460971 5.36452214 5.09893388]
 [2.31375316 2.20142422 6.91482905]]
arr:
 <class 'numpy.ndarray'>

4、数组的索引

  • 使用下标

  • 使用切片—获取多个元素时使用

  • 使用下标列表

    arr = np.array([5, 6, 4, 3, 7, 8, 1, 2])
    print('获取5、6、7元素:', arr[[0, 1, 4]])
    结果:
    获取567元素: [5 6 7]
    
    # 注意:
    # 使用下标会降低维度,而使用切片不会降低维度!
    # 使用切片时,索引的元素的下标必须要有规律
    
  • bool数组索引

    # bool数组----数组里面的值全部都是bool类型的,这样的数组称之为bool数组
    # ---bool数组的长度必须和要索引的那个数组对应的维度上的值相等!
    # ---bool数组索引的时候,保留True,干掉False!
    arr = np.array([[1, 3, 7, 8],
                    [9, 10, 12, 0],
                    [19, 20, 18, 16],
                    [6, 5, 4, 31]])
    msk = np.array([0, 1, 2, 0], dtype=np.bool_)
    print('msk:\n', msk)
    # # 利用bool数组索引
    print('bool数组索引:\n', arr[msk, :])
    print('bool数组索引:\n', arr[:, msk])
    ----------------------------------------------------------------------
    结果:
    msk:
     [False  True  True False]
    bool数组索引:
     [[ 9 10 12  0]
     [19 20 18 16]]
    bool数组索引:
     [[ 3  7]
     [10 12]
     [20 18]
     [ 5  4]]
    

5、数组的内部转换

1、修改形状-------前后元素个数不能发生改变

shape属性重新赋值

arr.shape = (2, 3)
print('arr:\n', arr)
结果:
arr:
 [[0 1 2]
 [3 4 5]]

reshape修改

arr = np.arange(0, 6, 1)
arr = arr.reshape((2, 3))
print('arr:\n', arr)
结果:
arr:
 [[0 1 2]
 [3 4 5]]
-------------------------------------------------------------------------
# -1 是占位的作用!
arr = arr.reshape((-1, 3))
print('arr:\n', arr)
结果:
arr:
 [[0 1 2]
 [3 4 5]]

将高维度 转化为 一维

arr = np.array([[1, 3, 7, 8],
                [9, 10, 12, 0],
                [19, 20, 18, 16],
                [6, 5, 4, 31]])

print('arr:\n', arr)  #-------都为对该arr操作
-------------------------------------------------------------------------
# 转化成一维数组
arr.shape = (-1,)
print('arr:\n', arr)
结果:
arr:
 [ 1  3  7  8  9 10 12  0 19 20 18 16  6  5  4 31]
-------------------------------------------------------------------------
order = 'C' --表示行优先   F表示列优先
arr = arr.reshape((-1,), order='C')
print('arr:', arr)
结果:
arr: [ 1  3  7  8  9 10 12  0 19 20 18 16  6  5  4 31]
-------------------------------------------------------------------------
# flatten   ravel --将数组展开成一维的!
# order = 'C' --表示行优先   F表示列优先

arr = arr.flatten(order='C')
print('arr:\n', arr)
结果:
arr: 
 [ 1  3  7  8  9 10 12  0 19 20 18 16  6  5  4 31]
arr = arr.flatten(order='F')
print('arr:\n', arr)
结果:
arr:
 [ 1  9 19  6  3 10 20  5  7 12 18  4  8  0 16 31]
-------------------------------------------------------------------------
# 建议使用 ravel
arr = arr.ravel(order='C')
arr = arr.ravel(order='F')
print('arr:\n',arr)
2、修改数据类型

在创建数组的时候,通过dtype属性 指定数组的数据类型

# arr = np.ones((2, 2), dtype=np.float64)
# print('arr:\n', arr)
# print('arr:\n', arr.dtype)
结果:
arr:
 [[1. 1.]
 [1. 1.]]
arr:
 float64
-------------------------------------------------------------------------
# # 如果想要修改数据类型
# # arr = np.int64(arr)  # 强制修改是可行的,但是不建议!
# # print('arr:\n', arr)
# # print('arr:\n', arr.dtype)
结果:
arr:
 [[1 1]
 [1 1]]
arr:
 int64

可以使用 astype来修改数据类型

# arr = arr.astype('int')
# print('arr:\n',arr)
# print('arr:\n',arr.dtype)

# arr = arr.astype(np.float32)
# print('arr:\n',arr)
# print('arr:\n',arr.dtype)

6、数组合并和拆分

合并:
#创建数组
import numpy as np
arr1 = np.arange(6).reshape((2, 3))
print('arr1:\n', arr1)

arr2 = np.zeros((2, 3), dtype=np.int32)
print('arr2:\n', arr2)

arr3 = np.array([1, 1, 1], dtype=np.int32)
print('arr3:\n', arr3)

结果:
arr1:
 [[0 1 2]
 [3 4 5]]
arr2:
 [[0 0 0]
 [0 0 0]]
arr3:
 [1 1 1]
  • 下方添加——垂直合并 ---- vstack

    res = np.vstack((arr1, arr2))
    print('res:\n', res)
    
    结果:
    res:
     [[0 1 2]
     [3 4 5]
     [0 0 0]
     [0 0 0]]
    
  • 在右侧添加——水平合并 ---- hstack

    res = np.hstack((arr1, arr2))
    print('res:\n', res)
    
    结果:
    ret:
     [[0 1 2 0 0 0]
     [3 4 5 0 0 0]]
    
  • !!!注意:垂直合并要保证列数一致, 水平合并要保证行数一直否则会报错

    y = np.hstack((arr1, arr2, arr3))
    print('y:\n',y)  # 错误的,因为行数不一致!
    
    结果:
    ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 2 has 1 dimension(s)
    
  • np.concatenate合并——必须保证维度是一样的,axis控制是行合并还是列合并

    ret = np.concatenate((arr1, arr2), axis=0)
    print('ret:\n',ret)
    
    结果:
    ret:
     [[0 1 2]
     [3 4 5]
     [0 0 0]
     [0 0 0]]
    
    
    res = np.concatenate((arr1, arr2), axis=-1)
    print('res:\n',res)
    
    结果:
    res:
     [[0 1 2 0 0 0]
     [3 4 5 0 0 0]]
    
拆分——拆分指定份数,必须能够平均拆分!否则会报错
# 创建数组
arr = np.arange(16).reshape((4,4))
print('arr:\n', arr)

结果:
arr:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
  • 水平拆分——hsplit

    ret = np.hsplit(arr, 2)
    print('ret[0]:\n', ret[0])
    print('ret[1]:\n', ret[1])
    结果:
    ret[0]: [[ 0  1]
    		 [ 4  5] 
    		 [ 8  9] 
    		 [12 13]]
    ret[1]: [[ 2  3] 
    		[ 6  7] 
    		[10 11] 
    		[14 15]]
    
  • 垂直拆分——vsplit

    ret = np.vsplit(arr, 2)
    print('ret:\n', ret[0])
    print('ret:\n', ret[1])
    结果:
    ret: [[0 1 2 3] 
    	[4 5 6 7]]
    ret: [[ 8  9 10 11] 
    	[12 13 14 15]]
    
  • 若传递的是列表的话

    eg:

    ret = np.hsplit(arr, [1, 3])
    # 会拆分成 :1, 1:3, 3: 三部分,相当于在这两个点进行切割
    
  • 直接拆分——np.split — 通过axis控制垂直还是水平

    ret = np.split(arr, [1, 3], axis=0)
    print('ret0:\n', ret)
    结果:
    ret0:
     [array([[0, 1, 2, 3]]), array([[ 4,  5,  6,  7],
           [ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])]
    
    ret = np.split(arr, [1, 3], axis=-1)
    print('ret-1:\n', ret)
    结果:
    ret-1:
     [array([[ 0],
           [ 4],
           [ 8],
           [12]]), array([[ 1,  2],
           [ 5,  6],
           [ 9, 10],
           [13, 14]]), array([[ 3],
           [ 7],
           [11],
           [15]])]
    
  • 通过索引切割获取(常用此方法)

    a = arr[:, :-1]  # [行, 列]
    b = arr[:, -1:]
    print('a:\n', a)
    print('b:\n', b)
    
    结果:
    a:
     [[ 0  1  2]
     [ 4  5  6]
     [ 8  9 10]
     [12 13 14]]
    b:
     [[ 3]
     [ 7]
     [11]
     [15]]	
    

注意点:

1、获取列数

对于任何维度的数组,获取列数的话,都为数组形状返回的元组的最后一位数据

数组.shape[-1]

2、ones数组、zeros数组

ones数组和zeros数组主要用来占位

3、参数注意

  1. random.random(参数) 参数为int类型或者元组,可为多维数组

  2. random.rand(参数)random.randn(参数)

    参数为int类型或者行列数或多维数组的值不能使用元组作为参数传递,用逗号隔开

    arr = np.random.rand((2,3,2))
    print('arr:\n',arr)
    print('arr:\n',type(arr))
    结果:
    TypeError: 'tuple' object cannot be interpreted as an integer
    ----------------------------------------------------------------------arr = np.random.randn(10)
    arr = np.random.randn((2,3,2))
    print('arr:\n',arr)
    print('arr:\n',type(arr))
    结果:
    TypeError: 'tuple' object cannot be interpreted as an integer
    

绘图资料:

1、绘图(查看图形及源代码案例)

[matplotlib绘图]:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值