数据分析进阶

numpy

numpy提供了一种数组类型,高维数组,提供了数据分析的运算基础(业务表一般就是二维)
import numpy as np
导入numpy库,并查看numpy版本
np._version_

创建array

数据类型一致的一个连续的内存空间,python的列表list不要求数据类型一致
numpy的设计初衷是用于运算的,所以对数据类型进行统一化
如果传进来的列表包含不同的类型,则统一为同一类型,优先级:str>float>int

创建一个numpy的数组

array = np.array([1])

参数介绍:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

  • dtype数据类型,可选
  • copy对象是否需要复制,可选
  • order创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
  • subok默认返回一个与基类类型一致的数组
  • ndmin指定生成数组的最小维度

创建高维数组

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

以1填充的数组
shape =(m,n) m行n列 二维数组
shape = (m) m个元素的一维数组
shape = (m,) m个元素的一维数组

shape = (m,1) m行1列的二维数组
shape = (1,n) 1行n列的二维数组

`#构造一个5行3列的二维数组`
np.ones(shape=(5,3),dtype=np.int(8))
#构造一个长度为3的一维数组
np.ones(shape=(3))

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

以0填充数组

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

fill_value是填充值,填充值填充数组

4. * np.eye(N,M=None,k=0,dtype=float)

单位矩阵的构造方式
对角线为1其他位置为0
N控制阶数,M和N默认相等,k控制对角线位移

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

生成等差数列方法一
七时至,终止值,个数
np.linspace(0,10,10,endpoint=False)生成一个从0到9(因为endpoint为False)的等差数列,一共十个数

6. np.arrange([start,] stop, [step,] dtype=None)

生成等差数列方法二
七十至,终止值,步长
np.arrange(0,10,step=1)
生成一个0-9的数组

7. np.random.randint(low,high=None,size=None,dtype='|')

size相当于shape
生成随机整数
np.random.randint(0,100,size=(5,5))

8.正态函数分布

  • np.randaom.randn(d0,d1,...,dn)标准正态分布
  • np.random.normal()普通正态分布
    标准
    np.random.randn(3,5)
    普通
    np.random.normal(loc=170,scale=5,size=(5,3))
    loc数学期望,scale方差

9. np.random.random(size=None)

生成0-1的随机小数,左闭右开
np.random.random(size=100)
np.random.random(5,3)

10. np.random.permutation(10)

生成0-9的随机无序整数索引

ndarray的属性

4个必记参数:
ndim:维度
shape:形状(各维度的长度)
size:总长度
dtype:元素类型
创建属性如何访问如何计算

array = np.array([1,4,6,8,9])
array.ndim #1
array.shape #
array.size #5
array.dtype # int

索引

`import numpy as np
#索引
data = np.array([[1,2,3],[4,5,6]])
#列表的访问方式在这里可以兼容
print(data[0][1])
#np特有的索引方式:用维度索引
print(data[0,1])
#用布尔值访问,使用bool列表作为索引
array1 = np.array([1,2,3,4,5])
print(array1>3) #返回一个bool列表[False False False  True  True]
#用布尔列表判断
print(array1[array1>3])`

切片

所有的切片都是开区间,左闭右开

`import numpy as np
#切片
array2 = np.random.randint(0,10,size=(5))
print(array2)
print(array2[0:3])

array3 = np.random.randint(0,100,size=(5,6))
#行切片
print(array3[0:2])
#列切片,不论多少维,每一个维度的切片范围都是用:表示,使用,分割,最后一个维度可以省略,但是被切片的维度之前的不能省
print(array3[:,0:2]) #0:2表示切前面两列,:,表示保留一个维度的所有并用逗号隔开`

变形

import numpy as np
#变形,reshape函数的参数是一个元组,元组乘积是数组的元素数量
arr = np.random.randint(0,10,size=(10))
print(arr)
print(arr.reshape(5,2))

级联

np.concatenate()

  • 级联需要注意的点:
  • 级联的参数是列表,一定要加上中括号或小括号
  • 维度必须相同
  • 形状相符
  • 重点级联的方向默认是shape这个tuple的第一个值所代表的维度方向
  • 可通过axis参数改变级联的方向

import numpy as np
#连接方式一
arr1 = np.random.randint(0,10,size=(3,3))
arr2 = np.random.randint(10,20,size=(3,3))
print(arr1)
print(arr2)
print(np.concatenate((arr1,arr2),axis=1))
#参数:tuple一个元组,数组名组成的元组;(默认数组之间纵向连接);axis连接方式,0是纵向连接,1是横向连接

#连接方式二,na.hstack与np.vstack,h=horizontal,v=certical
print(np.hstack((arr1,arr2)))

切分

切分与切片类似,但是返回值更多
与级联类似,三个函数完成切分工作

  • np.split
  • np.hsplit
  • np.vsplit
import numpy as np
#np.split,直接指定切分的份数
arr = np.random.randint(0,100,size=(6,6))
print(arr)
print(np.split(arr,indices_or_sections=2))
print(np.split(arr,indices_or_sections=2,axis=1))
print(np.split(arr,indices_or_sections=[2,5],axis=1)) #切分成三部分,0-2,2-5,5-最后
print('-------------------------------------')

#np.hsplit,横向切分
print(np.hsplit(arr,indices_or_sections=2))

#np.vsplit,纵向切分
print(np.vsplit(arr,indices_or_sections=2))

副本

所有赋值运算不会为ndarray的任何元素创建副本,对赋值后的对象的操作也对原来的对象生效
可使用copy()函数创建副本

#副本
arr = np.random.randint(0,10,size=(3,5))
print(arr)
copy_arr = arr.copy()
print(copy_arr)
#cpoy不会更改原始值
posted @ 2024-05-22 14:29  黄紫荆  阅读(19)  评论(0)    收藏  举报