《利用python进行数据分析.第三版》 第四章 Numpy

《利用python进行数据分析.第三版》 第四章 Numpy

一、numpy的ndarray:一种多维数组对象
1. 创建nadrray

属性:
arr.nidm:维度
arr.shape:维度大小
arr.dtype:数值类型

表达规则:
np.函数(列表或元祖)

1.np.array(列表或者元祖);array函数:接受一切序列型的对象:
2.np.zeros(数值或者元祖);zeros函数:创建指定长度全0数组
3.np.ones(数值或者元祖);ones函数:创建指定长度全1数组
4.np.arange(数值)#后面一定跟数值
#一维数组:np.arange(12)
#二维数组:np.arange(12).reshape(3,4)

注:以上创建函数后是列表或者数值即为一维数组;是元祖即为二维数组

#列表转化为一维数组
data1=[6,7.8,8,0,1]
     arr1=np.array(data1)
     arr1
     array([6. , 7.8, 8. , 0. , 1. ])
#嵌套列表转化为多维数组
data2=[[1,2,3,4],[5,6,7,8]]
arr2=np.array(data2)
arr2
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
 #arange函数
 data3=np.arange(12)

这里写图片描述
2.ndarray的数据类型

 1. 直接设置数据类型
     arr1=np.array([1,2,3,4],np.float64)
 2. 转化数据类型:astype
     int_arr1=arr1.astype(np.int64)
 3. 传递数据属性
    int_array=np.arange(10) ; cailbers=np.array([.1,.2,.3,.4],np.float64)
    int_array.astype(cailbers.dtype)

笔记:调用astype总会创建一个新的数组(一个数据的备份),即使新的dtype与旧的dtype相同

3.NumPy数组的运算

  1. 大小相等的数组之间的任何算术运算都会将运算应用到元素级:
  2. 数组与标量的算术运算会将标量值传播到各个元素:
  3. 大小相同的数组之间的比较会生成布尔值数组:

4.基本的索引和切片

  1. 一维数组:类似于Python
  arr[2];arr[3:6];
  arr[3:6]=12#该层意思是将12这个值广播到第四个数到第六个数,该范围内的数值均为12

  #跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上。
  arr=np.arange(10)
  arr_slice=arr[3:6]#取一切片
  arr_slice[1]=78#更改切片中的某个数据
  arr#切片是原始数据的视图,切片视图改变数据,原始数据也被改变
  array([ 0,  1,  2,  3, 78,  5,  6,  7,  8,  9])

  #更改全部切片
  arr_slice[:]=12

  #注意:如果你想要得到的是ndarray切片的一份副本而非视图,就需要明确地进行复制操作,例如
  arr[5:8].copy()。

  2. 二维数组:
  #索取某一行:arr[2]
  #索取某一行某一列的具体数值:
  arr[2][1]
  arr[2,1]
  两者是等价的

  3.多维数组n
  #索取某个n-1维数组:arr[1]
  #索取某个n-2为数组:arr[1][0]
  ---------
 arr=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
 arr
 array([[[ 1,  2,  3],
        [ 4,  5,  6]],
       [[ 7,  8,  9],
        [10, 11, 12]]]) 

arr[0]
array([[1, 2, 3],
       [4, 5, 6]])

arr[0,1]
array([4, 5, 6])

arr[0,1,2]
6 

5.切片索引

1、一维数组:和python列表差不多
2、二维数组:看下图
3、切片赋值:arr[:2,1:]=0,图片中数字被赋值0

这里写图片描述

6.布尔型索引
布尔型索引就是将用True和False来判定符合条件的

1. 一维数组:names=="Bob"-->布尔型数组
2. 二维数组:一般结合一维数组进行判定。 data[name=="Bob"]
#但是前提必须是:布尔型数组的长度必须跟被索引的轴长度一致。
3. 布尔型数组和切片、整数(或整数序列)混合使用:data[name=="Bob", 2:]
data[name=="Bob", 3]
4. 不等于(!=)或者~: data[~(names=="Bob")]
5. ~是反转条件
6. 组合应用多个布尔条件:使用&、|之类的布尔运算符,但是不能使用and和or
7. mask=(names=="Bob")|(names=="will")   -->  data[mask]
8. 布尔类型赋值:data[data<0] =0
    data[names != "Joe"] =7

通过布尔型索引选取数组中的数据,将总是创建数据的副本,即使返回一模一样的数组也是如此。
注意:Python关键字and和or在布尔型数组中无效。要是用&与|。

7.花式索引

#花式索引(Fancy indexing)是一个NumPy术语,它指的是利用整数数组进行索引。

1. 为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可
2. 方案一:arr[  [4,3,0,6]  ] 里面传入的是一个一维数组,这一维数组里面包括索引值。
3. 方案二:arr[   [1,5,7,2],[0,3,1,2]   ] 得到的是一个一维数组,最终选出的是元素(1,0)、(5,3)、(7,1)和(2,2)。无论数组是多少维的,花式索引总是一维的。
4. 方案三:如果要得到上述选取1,5,7,2行数据,又进行重新排序
arr[  [1,3,5,7] ] [ : , [0,3,1,2]  ]
#用np.empty法构造二维数组
arr=np.empty((8,4))
for i in range(8):
     arr[i]=i
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])
#取行
arr[[-3,-5,-7]]
array([[5., 5., 5., 5.],
       [3., 3., 3., 3.],
       [1., 1., 1., 1.]])

#取对应的一维数组
arr[[1,5,7,2],[0,3,1,2]]
array([1., 5., 7., 2.])
#最终选出的是元素(1,01)、(5,3)、(7,1)和(2,2)。无论数组是多少维的,花式索引总是一维的。

#取某几行的某几列
arr[[1,5,7,2]][:,[0,3,1,2]]
array([[1., 1., 1., 1.],
       [5., 5., 5., 5.],
       [7., 7., 7., 7.],
       [2., 2., 2., 2.]])

8.数组转置和轴对换

    1. 转置:转置是重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作)。
    2. arr.T
    3. 高维数组:在进行矩阵计算时,经常需要用到该操作,比如利用np.dot计算矩阵内积:np.dot(arr.T,arr)
    4.arr=np.arange(16).reshape((2,2,4))
    arr.transpose((1,0,2)):
    第一个轴被换成了第二个,第二个轴被换成了第一个,最后一个轴不变。

二、通用函数:快速的元素级数组函数

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。

 1.一元函数:np.abs(data)
 2.二元函数:np.add(data1,data2)

d

这里写图片描述

三、利用数组进行数据处理

  1. 将条件逻辑表述为数组运算

    方法一:(x if c else y)  
    方法二:np.where(c,x,y)
    
#方法一:学习此方法中的for in zip
xarr=np.array([1,2,3,4,5])
yarr=np.array([6,7,8,9,10])
cond=np.array([True, False,True,True,False])

result=[(x if c else y) 
        for x, y, c in zip(xarr, yarr, cond) ]

result

[1, 7, 3, 4, 10]


方法二:np.where(c,x,y)三元函数
arr=np.random.randn(4,4)
arr
np.where(arr>0,2,-2)

array([[-2, -2,  2,  2],
       [-2, -2, -2,  2],
       [ 2, -2, -2, -2],
       [ 2,  2,  2,  2]])

2.数学和统计方法
这里写图片描述

arr.sum()—–>np.sum()
arr.mean()—–>np.mena()
arr.sum(axis=0/1)—–>np.sum(axis=0/1)

3.用于布尔型数组的方法
arr=np.random.randn(100)
(arr>0).sum()#arr>0是布尔数组

bools=np.array([False, False, True, False])
bools.any()#对数组里面含有1个及以上的返回True
bools.all()#对数组里面全部含有True的返回True

4.排序

一维数组:arr.sort()
二维数组:arr.sort(axis=0/1)
高级:np.sort(arr)

5.唯一化以及其他的集合逻辑

 唯一化:np.unique(names)
 测试一个数组中的值在另一个数组中的成员资格,返回布尔型数组:np.in1d(arr_需要判定的数组,[2,3,5])#两个参数:第一个需要判定的数组,第二个是判定的条件
   values=np.array([6,0,0,3,2,5,6])       
 np.in1d(values,[2,3,5])
 array([False, False, False,  True,  True,  True, False])

这里写图片描述

四、用于数组的文件输入输出

      np.save("some_arr",arr)
      np.load("some_arr.npy")

五、线性代数

     x.dot(y)
     np.dot(x,y)
     x@np.oens(3)
     以上三者都是等价的

这里写图片描述

六、随机数生成
七、随机漫步

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页