python数据分析(numpy)

1. numpy详解

1.1 array函数使用

1.2 arange函数的使用

1.3 linspace函数使用

1.4 logspace函数使用

1.5 数组元素的属性

1.6 数组的切片和索引

1.7 numpy函数

1.8 numpy文件操作

1.9 numpy随机数

2.0 其它函数

1.1 array函数使用

numpy.array(object,dtype=none,copy=True,order=none,subok=False,ndmin=0)

参数说明:

  • 1.object:表示一个数据序列
  • 2.dtype:可以修改数据类型
  • 3.copy:数组能否被复制
  • 4.ndmin:指定数据维度
  • 5.subok:默认使用object内部数据类型

在使用numpy内部模块时,都需要导入模块:

import numpy as np
  • array在传入数据序列时,可以是列表,元组或者是迭代器,如:
放入列表
a = np.array([1, 2, 3, 4, 5])
print(type(a))  # 转变成numpy数组类型
放入元组
b = np.array((1, 2, 3, 4, 5))
print(type(b))  # 转变成numpy数组类型
放入迭代器
c = np.array(range(10))  # 把迭代器的数据保存为一个数组
print(c)
  • 在传入的数据序列中如果有一个元素是浮点型,所有的元素都会被转变为数组的浮点型,可以使用dtype参数强制转换为int类型,如果是浮点类型转换为整形会向下取整:
浮点型
e = np.array([1, 2, 3.14, 4, 5])  # 有一个为浮点型都会转换成浮点型
print(e)
e = np.array([1, 2, 3.14, 4, 5], dtype='int')  # 使用dtype强制转换为int类型
  • 当object参数传入两个元素相同的序列时,会变成一个二维数据,使用 数组名.ndim可以查看数组的维度,使用 数组名.shape 可以查看数组的行列情况:
嵌套数组
f = np.array([[1, 2, 3, 4, 5], ('a', 'b', 'c', 'd', 'e')])  # 两个序列的数据数量一样才可以转换成二维的
print(f.ndim)  # 查看维度
print(f.shape)  # 查看行列情况
print(f)
  • array在复制中,使用 arr2 = np.array(arr1) 这样的复制类型,是一种深拷贝,拷贝出来的地址是不一样的,使用 arr2 = arr1 这样的复制类型,是一种浅拷贝,只要有一个元素改变,另一个也会改变:
复制操作
arr1 = np.array([1, 2, 3, 4, 5])
深拷贝
arr2 = np.array(arr1)
在这里的复制是深拷贝,而列表中的复制是浅拷贝
print('arr1:', id(arr1), 'arr2:', id(arr2))  # id 可以输出变量的地址
浅拷贝
arr3 = arr1  # 这种拷贝修改任何一个另一个都会跟着修改

1.2 arange函数的使用

numpy.arange(start,stop,step,dtype)

参数说明:

  • 1.start:起始值,默认为0
  • 2.stop:终止值,不包含
  • 3.step:步长,默认为1
  • 4.dtype:返回数组类型

使用该函数可以只传递stop参数,也可以指定参数名,如step=2,当数据过大时,输出结果会以省略号替代:

整形
num1 = np.arange(10)
print(num1)
浮点型
num2 = np.arange(10.0)
print(num2)
限定终值和步长
num3 = np.arange(2, 30, 2)
print(num3)
参数指定
num4 = np.arange(20, step=3)
print(num4)
数据太大会自动跳过
num5 = np.arange(10000)
print(num5)

1.3 linspace函数使用

numpy.linspace(start,stop,num,endpoint,retstop,dtype) 这是一个生成等差数列的函数

参数说明:

  • 1.num:生成的元素个数
  • 2.endpoint:这是一个bool类型的参数,为True时会包含stop值
  • 3.retstop:这是一个bool类型的参数,为True时生成的数据会显示间距

linspace返回的数组中元素都是浮点型,例子:

等步长生成
num1 = np.linspace(1, 10, 10)  # 输出浮点型
print(num1)
#
num2 = np.linspace(0, 4, 9)
print(num2)
num3 = np.linspace(0, 4.1, 9)
print(num3)
设置endpoint参数
num4 = np.linspace(2.0, 3.0, num=5, endpoint=True)
print(num4)
设置显示retstep显示计算后的步长
num5 = np.linspace(2.0, 3.0, num=5, retstep=True)
print(num5)

1.4 logspace函数使用

numpy.logspace(start,stop,num,endpoint,base,dtype) 这是一个生成等比数列的函数

参数说明:

  • 1.num:要生成的等步长的元素数量
  • 2.endpoint:这是一个bool类型的参数,为True时会包含stop值
  • 3.base:对数log的底数,默认为10

该函数使用返回的结果都是浮点型,例子:

base指定底数
num1 = np.logspace(0, 9, 10, base=2)  # 返回结果都是浮点型
print(num1)
使用前三个数均分为等份的数
num2 = np.logspace(1, 5, 3, base=2)
print(num2)

1.5 数组元素的属性

上面属性的使用都在以下的代码段中,属性 reshape(元组),可以改变数组的维度, resize(数组,元组),这里会重新改变数组维度,并且会重复填写数组的元素,例子:

shape:查看行列,ndim:查看维度,size:数组元素个数
一维数组
num1 = np.array([1, 2, 3, 4, 5])
print('num1的维度:', num1.ndim)
print('num1的数组元素个数:', num1.size)
print('一维数组:', num1.shape)
print('元素大小:', num1.itemsize)
二维数组
num2 = np.array([[1, 2, 3], [4, 5, 6]])
print('num2的维度:', num2.ndim)
print('num2的数组元素个数:', num2.size)
print('二维数组:', num2.shape)
三维数组
num3 = np.array([[[1, 2, 3],
                  [4, 5, 6]],
                 [[1, 2, 4],
                  [4, 5, 6]]])
print('num3的维度:', num3.ndim)
print('num3的数组元素个数:', num3.size)
print('三维数组:', num3.shape)

reshape 改变维度
a = np.arange(20).reshape((4, 5))
print(a)

resize:如国新数组大于原始数组,新数组将填充a的重复副本
b = np.arange(20)
c = np.resize(b, (4, 6))
print(c)

1.6 数组的切片和索引

1.6.1 一维数组

一维数组的切片和索引与列表的一样:

一维数组操作
数组切片索引和列表的一样
a = np.array([1, 2, 3, 4, 5])
print(a[2:4:2])
使用下标切成不重叠的两部分
print('a[:2]:', a[:2])
print('a[2:]:', a[2:])

1.6.2 二维数组

下面例子中,第五个是在二维数组中取出了第二第三行,变成一个两行四列的数组,再从中取出第二行数据,例子:

二维数组操作
num1 = np.array(range(20)).reshape(4, 5)
print(num1[2])  # 拿到一行数据
print(num1[2][2])  # 拿到一个数据
print(num1[2, 2])  # 第一个操作行,第二列操作列
print(num1[2:, 2:])  # 可以对数组行列各自操作
print(num1[2:][1])   # 第一个参数先取出行,第二个参数再取出行
print(num1[2:])  # 对行数进行切片

以坐标当索引,例子:

用坐标当索引
num2 = np.array(range(12)).reshape(3, 4)
rest1 = num2[[0, 1, 2], [0, 0, 0]]  # 以坐标作为索引,第一列参数是行坐标,第二列参数为列坐标
rest2 = num2[:2, :2]  # 取出范围内的数据,按会以矩阵形式输出

1.6.3 bool运算

在使用bool类型数组进行数据取出时,True类型的数量必须要一致,例子:

bool运算:可以使用算式拿到想要的数据
num3 = np.array(range(12)).reshape(3, 4)
print(num3[num3 > 6])  # 返回所有数值大于6的数字
print(num3[num3 % 2 == 1])  # 返回奇数
print(num3[(num3 > 4) & (num3 < 9)])  # &:和的意思
print(num3[(num3 < 4) | (num3 > 9)])  # |:或的意思
row1 = np.array([True, False, True])  # 作为一个数组作用到另一个数组上,行和列一一对应,当为True时,即拿到该行数据,否则不能
colum1 = np.array([True, False, True, False])
print(num3[row1, colum1])  # 合用时True数量要一致
print(num3[row1])
print(num3)
temp = num3[::2]  # 先拿出行
temp = temp[:, [0, 2, 3]]  # 再拿出列
print(temp)

1.6.4 广播机制

广播机制其实就是数组的运算,例子:

广播机制:不同的数组进行计算,数组的列必须相同,且必须有一个数组是单个值
num4 = np.array([1, 2, 3, 4])
num5 = np.array([10, 20, 30, 40])
print(num4*num5)  # 相同维度的运算
num6 = np.array([[1, 2, 3, 4], [10, 20, 30, 40], [100, 200, 300, 400]])
num7 = np.array([[2, 3, 4, 5]])  # 数组的运算必须要列的长度相同
在数组运算中行是和行相乘的,一行对应一行,当列数为1时,无论多少行都可以相乘,如  {(2,1)和(2, 4)} {(2, 1)和(1, 4)}
num8 = np.array([[1], [2]])
num9 = np.array([[1, 2, 3, 4], [2, 3, 4, 5]])
print(num8*num9)  # 不同维度的运算

1.7 numpy函数

1.7.1 mean:求平均数

例子:

mean:求平均数
num1 = np.array(range(20)).reshape(4, 5)
print(num1.mean())  # 计算数组中的函数
print(num1.mean(axis=0))  # axis=0 按列从上往下运算
print(num1.mean(axis=1))  # axis=1 按行从左往右

1.7.2 median:求中位数

例子:

median:中位数
num2 = np.array(range(12)).reshape(3, 4)
print(np.median(num2))  # median:找到数组中的中位数

1.7.3 std:标准差

例子:

std:标准差
num3 = np.array([95, 85, 75, 65, 55, 45])
num4 = np.array([73, 72, 71, 69, 67, 68])
print(np.std(num3))  # 求标准差
print(np.std(num4))

1.7.4 max:求最大值,min:求最小值

例子:

max:最大值  min:最小值
num5 = np.array([[1, 3, 5, 3, 6, 99, 4, 7], [4, 4, 1, 2, 7, 2, 2, 55]])
print(num5.max(axis=0), num5.max(axis=1))  # 找最大值 axis=0:从上往下找,axis=1:从左往右找
print(num5.min())  # 找最小值

1.7.5 sum:求和

例子:

sum:求和
num6 = np.array(range(20)).reshape(4, 5)
print('从上往下累加:', num6.sum(axis=0), '从左往右累加:', num6.sum(axis=1))

1.7.6 average:加权平均数

例子:

average:加权平均值
num7 = np.array([30, 55, 63])
weights = np.array([0.3, 0.3, 0.4])  # 权重
print(np.average(num7, weights=weights))  # 权重和数组行列数一致

1.8 numpy文件操作

关键字:loadtxt

loadtxt(fname,dtype,comments,delimiter,coverters,skiprows,usecols,unpack,ndmin,encoding)

参数说明:

  • 1.fname:文件名称,支持压缩文件
  • 2.comments:字符串或字符串组成的列表
  • 3.delimiter:字符串,作为分割字符
  • 4.converters:字典
  • 5.skiprows:跳过特定行数据
  • 6.usecols:传入的参数是元组,取出特定列
  • 7.unpack:bool类型
  • 8.encoding:编码方式

使用例子:

txt文件
data = np.loadtxt('1.txt', dtype='int8')
print(data)

csv文件
data1 = np.loadtxt('3.csv', dtype='int32', delimiter=',', encoding='utf8')  # delimiter:使用了 , 分割符
print(data1)
csv中不同的数据类型
dt是一个自定义类型,为了符合csv文件中的数据类型
dt = np.dtype([('name', 'U10'), ('age', 'int'), ('weight', 'float')])  # 字符串需要的字符格式 Un
data2 = np.loadtxt('2.csv', dtype=dt, delimiter=',', encoding='utf8')  # 文件中一行是一个元组,返回的是列表
print(data2['name'])
print(data2)
跳行使用 skiprows
data3 = np.loadtxt('4.txt', dtype=dt, skiprows=1, encoding='utf8')  # 文件中一行是一个元组,返回的是列表,跳过第一行
print(data3)
取出特定列:文件中的列是从0开始数
data4 = np.loadtxt('4.txt', usecols=(1, 2), skiprows=1, encoding='utf8')  # usecols用元组的方式取出数据
print(data4)

使用自定义类型去判断获取数据:

计算女生的平均身高
dt1 = np.dtype([('name', 'U10'), ('sex', 'U1'), ('age', 'int'), ('height', 'int')])
data5 = np.loadtxt('5.txt', dtype=dt1, skiprows=1, encoding='utf8')
print(data5)
isgirl = (data5['sex'] == '女')  # 判断是否是女生
print(isgirl)
height = data5['height'][isgirl]  # 拿到身高
print(np.mean(height))  # 算出平均身高

1.9 numpy随机数

例子:

生成分布均匀的随机数
avg = np.random.rand(1, 3, 3)  # 第一个参数是范围,第二个参数是组数,第三个参数是每组中的列数
print(avg)
和 rand 一样,但是生成的是一组正态分布的数
avg1 = np.random.random(3)
print(avg1)
随机生成整数:random(low,high,size,dtype)
1.返回随机数,范围区间在[low,high],包含low,不包含high
2.low:最小值  high:最大值  size:数组维度大小  dtype:数据类型
3.high没有填写时默认随机数范围[0,low]
avg2 = np.random.randint(1, 20, size=(2, 4, 5))  # 生成两个3行4列的二维数组
print(avg2)
sample:随机生成0到1的随机数,参数控制数量
avg3 = np.random.sample(3)
print(avg3)
seed:随机种子,控制每次生成随机数时数据都一样
np.random.seed(2)
a = np.random.randn(3, 3)
np.random.seed(2)  # 每次调用随机数时都要先调用随机数种子
b = np.random.randn(3, 3)
print('a', a)
print('b', b)
正态分布函数:normal(参数1,参数2,元组)
1.参数1:均值
2.参数2:是标准差
3.元组:控制生成的是几行几列
avg4 = np.random.normal(1, 3, (2, 4))
print(avg4)

2.0 其它函数

例子:

resize:使用
num1 = np.array(range(20)).reshape(4, 5)  # 重复填充
print(np.resize(num1, (5, 7)))
append:使用
num2 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.append(num2, [[7, 8, 9]]))  # 添加数据
print(np.append(num2, [[7, 8, 9]], axis=0))  # 沿轴 0 添加元素  从上往下
print(np.append(num2, [[7, 8, 9], [10, 11, 12]], axis=1))  # 沿轴 1 添加元素  从左往右
insert:使用
num3 = np.array([[1, 2], [2, 3], [3, 4]])
print(np.insert(num3, 1, [11], axis=0))  # 从上往下的第二行加入11
print(np.insert(num3, 1, [11], axis=1))  # 从左往右的第二列加入11
delete:使用
num4 = np.array(range(12)).reshape(3, 4)
print(np.delete(num4, 1))  # 删除指定索引的元素
print(np.delete(num4, [1, 2, 3, 6]))  # 删除指定元素
argwhere:使用
num5 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.argwhere(num5 > 3))  # 返回了索引值
unique:使用
num6 = np.array([1, 2, 2, 3, 6, 4, 7, 3, 5])
print(np.unique(num6))  # 去重,并从小到大排序
a, b = np.unique(num6, return_index=True)  # 返回去重后的数组,和原在原数组时的索引位置
print(a, '\n', b)
c, d = np.unique(num6, return_counts=True)  # 返回数组,以及元素在原数组中出现的次数
print(c, '\n', d)
sort:使用
num7 = np.array([[1, 3, 2], [4, 3, 6], [2, 1, 3]])
print(np.sort(num7))  # 默认是从左到右排序
print(np.sort(num7, axis=0))  # 从上到下排序
argsort:使用
num8 = np.array([1, 4, 2, 6, 1])
print(np.argsort(num8))  # 返回排序后的索引值

Original: https://blog.csdn.net/weixin_62859191/article/details/126725621
Author: 爱笑的蛐蛐
Title: python数据分析(numpy)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/761377/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球