numpy—————数组操作

    最近看了《利用Python进行数据分析》复习了一下Numpy里的一些操作,做一些基本函数使用的总结,避免后面忘了又瞎找,提高效率。
 
一、 数组生成
  1.   创建数组          
# 1. 一维数组
import numpy as np
num = [ 1, 2, 3, 4, 5]
data = np.array(num) # 使用 numpy.array()/ numpy.asarray() 创建数组,返回数组类型 
#numpy.array()和numpy.asarray()区别:数据源为ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会
print data
print type(data)
print data.dtype
 
# 2. 创建二维/多维数组
arr = [ [1, 2, 3], [2, 2.5, 3], [3, 4, 5.5] ] data1 = np.array(arr) print data1 print data1.shape print type(data1) print data1.dtype

 

 
            一位数组结果如下左图, 二维/多维数组为右图:
        左图中数据list为 int,返回结果中的数组的dtype为int32;
        右图中的list 为 3行 ×3列的高纬列表, 且其中含有浮点数,所以创建的多维度数组的dtype为float64; shape查看数组维度(几行几列, 列表内嵌套几个列表为行数len(data1),每个列表有几个数据为列数len(data[1))(此时数据指常用的二维数组, 多维度同理向内递推)。
 
numpy—————数组操作_第1张图片 numpy—————数组操作_第2张图片
如果:行数 != 列数,  结果如下:
numpy—————数组操作_第3张图片
 
#创建全0, 全1数组和不确定值的数组
np.zeros(10)         #创建 10个数全0的一维度数组
np.zeros((3,5))      # 创建一个3行、5列全为0的数组  ,  函数括号中的元组为指定维度
np.ones()            #和 zeros() 同理 , 创建全1数组
np.empty((3,2,2))  # 创建不确定值的数组, 元组指定维度,因为empty会返回全0数组,不安全,多数情况下为未初始化的垃圾值(此处源于《利用Python进行数据分析》)
np.random.randn() #  正态分布数组创建
 
 
# arange() 创建整数组
arr3 = np.arange(15)
arr4 = np.arange(15).reshape((3,5)) #创建 3行5列 的整数数组
print arr3
print arr4

 

numpy—————数组操作_第4张图片
 
#创建对角矩阵
np.identity(5) #生成5×5的对角矩阵

 

numpy—————数组操作_第5张图片
  1.  ndarray 数据类型:
            A、常用常用:
                int8,uint8(符号和无符号, 还有int/uint16,int/uint32,int/uint65) 整型
                float16、float32、float64、float128(半精度浮点数、单精度、双精度、扩展精度)
                bool 布尔
                object (Python 对象)
                string    (固定字符类型)
            B、类型操作:
                
 # 创建数组时,指定
 data = pd.array(data, dtype=int32)  
 
 # astype() 强制转换
 data.astype(int32) # 强转为int32
 data.astype(int)  # 强转为int, 根据数据类型映射对应的dtype

 

 
二、索引和切片
  1. 低纬速度索引与切片
     array 切片和索引与list的基本相同
# 索引, 结果  下左图
 arr4 = np.arange(10).reshape((2,5))
 print arr4[0]
 print arr4[0][4] # 访问数字4
numpy—————数组操作_第6张图片
 
#以切片形式“广播式”得修改其中的值
arr5 = np.arange(10)  # 其中可以看到切片是在原始数据的视图,而不是拷贝,通过切片修改数据会改变原始数据;且拷贝多次会影响性能和占用大量内存
print arr5
arr5[3:5] = 12
print arr5
arr5[3:5].copy()     #对数据做显示的深拷贝

 

  numpy—————数组操作_第7张图片
  1. 高维素组索引与切片
  •   二维数组索引与切片(多维度数组切片方式和二维数组一样)
# 切片 下右图 data[a:b, c:d]#其中a:b 行切片, c:d列切片
arr2d = np.arange(1,10,1).reshape((3,3))
print arr2d
print arr2d[:1,1:]  # 切片是“包前不包后”(满嘴顺口溜,你想考研啊!!!) , :1 表示 第1行之前的数据(从0开始arr2d[0], [1,2,3] ); 1: 表示第一列arr2d[0]之后的数据arr[0][1:] ,为[2,3]
print arr2d[:2,:1]  # 与上述同理

 

numpy—————数组操作_第8张图片
  •   高纬度数组索引(以三维数组为例)
# 高纬度数组 维度解释
np.arange(12).reshape((2,2,3)) # arr[0]维度2×3, 有像arr[0]的有2个, 所以维度为 2× (2×3), arr[0] = [[ 0,  1,  2],[ 3,  4,  5]]
test_arr1 = np.arange(12).reshape((3,2,2)) ## arr[0]维度2×2, 有像arr[0]的有3个, 所以维度为 3× (2×2)
print test_arr1
print test_arr1[0].shape

 

numpy—————数组操作_第9张图片
# 多维数组索引就是层层递推访问
arr_3d_one = np.arange(12).reshape((2,2,3))
print "数组:" + str(arr_3d_one)
print "第一维度:"+str(arr_3d_one[0]) + '\n'     #数组第一维度索引
print "第二维度: " + str(arr_3d_one[0,0]) + '\n'  #向下一维度索引
print "第三维度: " + str(arr_3d_one[0,0,1]) + '\n' #向第三维度索引
print "数组第一维度长:%s" %( len(arr_3d_one) )
print "第二维度数组纬度值:%s" % str(arr_3d_one[0].shape)  

 

numpy—————数组操作_第10张图片
  1. 布尔索引:
  •  布尔索引的过程是通过创建一个布尔数组, 根据布尔数组中为True的索引值来 索引源数组
random_values = np.random.randn(3,7) # 3×7 符合正态分布的随机数
print random_values
stars = np.array(['Jordan', 'James', 'Kobe'])
stars == 'James'                     # 生成一个布尔数组(3×1), 布尔数组长度 和 源数组轴长必须 相等
random_values[stars == "James"]      # random_value[1], 布尔为真的行来索引

 

 
numpy—————数组操作_第11张图片
  •  创建布尔数组时, 可以使用 != 、| (或)、&(与)
stars == 'Jordan'
stars != 'Jordan'
(stars == 'Jordan') | (stars == 'James')
 
      

 

  1. 花式索引、转置和轴对换
  •   花式索引——利用整数数组来索引 (花式索引会复制一个数组)
        A. 花式索引————创建一维整数数组
            在《利用Python进行数据分析》中的例子是这样的
#结果如下左图
arr = np.empty((8,4))  # np.empty, 返回无初始化的数组
for i in range(8):
    arr[i] = i
print arr[[4, 3, 2, 1]]    
print arr[[-3, -5, -1]]

 

 
#这样很容易产生一种疑问或者误解, 我用整数数组[4, 3, 2, 1]数组值对应目标数组中的值时才会索引,为啥反向索引用的是;但是这样是错的
#用其他例子证明我自己理解错误了, 没有初始化那段,用随机值来证明是创建一个1维的整数索引数组, 可以使用正向、反向索引(-1开始)
arr1 = np.empty((8, 4))
print arr1
print arr1[[1, 3 ,5]]
print arr1[[-1, -3, -5]]
    输出结果如下:
numpy—————数组操作_第12张图片 numpy—————数组操作_第13张图片
        B.花式索引————多维索引
 #多维度数组就是利用 创建行索引与列索引之前的映射精确到具体值
arr = np.arange(16).reshape((4,4))
arr[[1,2,3], [2,2,3]
 
arr1 = np.arange(32).reshape((8,4))
print arr1
print arr1[[1,5,7,2]][:,[0,3,1,2]]  # 我理解的索引获取到一个区域, 其理解是 [1,5,7,2][0]= [4,20,28,8] 为第一列,其他历次顺序排
 
#np.ix_()也可以实现区域索引器
arr1[np.ix_([1,5,7,2], [0,3,1,2])]

 

        
numpy—————数组操作_第14张图片
  • 转置和轴变化 
# 转置
arr.T  #转置属性
np.dot(arr, arr.T) # 求矩阵内积, 矩阵内积后面再讲
arr.transpose() 
 
#轴变化
arr.swapaxes()
 

 

三、常用函数总结
  1. 常用函数
np.arange    #整数数组
np.abs          #绝对值
np.exp          # e的 幂次方(指数)
np.sqsrt        # 平方根
np.square     # 平方
#其他的就在文档里可以找到
# 常用统计函数
np.sum          # 求和
np.mean        #平均值
np.std      # 标准差
np.min/ np.max # 最大/最小值
np.var      # 方差
  1. Numpy中where使用(np.where)
#  np.where 就是 x  if  y else z 的矢量表示
arr3 = np.arange(10)
np.where(arr3<5, arr3, 10 * arr3)     #  arr3元素 < 5, 元素不变, 否则乘以10

 

numpy—————数组操作_第15张图片 numpy—————数组操作_第16张图片
  1. 其他功能
np.sort          # 数组排序,和Python sort函数一样是快排 , 返回已经排序的副本
 
# 集合操作
np.unique        # 数组中唯一值,并返回排序结果  就是 类似list转为集合并排序
np.in1d                   #  一个数组在另一个数组中是否存在, 返回布尔类型的数组
np.intersect1d(x, y)   # x, y 的交集
np.union1d(x,y)         # x, y 的并集
np.setdiff1d(x, y)       # 集合的差, 在x中不在y中
np.setxor1d(x, y)       #  集合对称差,在1个数组但不同时在2个数组中
 
# numpy文件读写, save和load函数
np.save(file_name, data)      #文件尾部无 .npy 格式会自动加上 .npy
np.load('file_name.npy')       # 加载数组为数组类型
np.savez                               # 保存为一个 .npz的压缩文件
 
# 矩阵运算
np.dot(x, y)   / x.dot(y)          # 矩阵乘法
np.trace                                # 对角元素和
np.det                                   # 矩阵的行列式
np.eig                                   # 方阵的 本征值和本征向量
np.inv                                   # 方阵的逆
np.pinv                                 #  矩阵的 Moore-Penrose伪逆
np.qr                                     # QR分解
np.svd                                   # 奇异值分解
np.solve                                # 解线性方程组 Ax = B, A为方阵
np.lstsq                                 # Ax = b 最小二乘解
 
#随机数  , np.random模块
np.randint                            # 给定上下范围的随机整数
np.randn                              # 正态分布, 均值= 0, 标准差=1的样本值
np.normal                            # 正太分布样本值
np.beta                                # beta分布样本值
 
# 还有很多其他随机数相关、分布相关函数,具体参考numpy手册,或者help函数查看用法

 

 
 

转载于:https://www.cnblogs.com/HankCui/p/11189732.html

你可能感兴趣的:(python,人工智能)