【数学建模学习笔记【集训十天】之第二天】(1)

测试是否安装成功

from numpy import * # 导入 numpy 库

print(eye(4)) # 生成对角矩阵

查看版本:

import numpy as np

print(np.version)

实现2个数组的加法:

1-原生Python实现

def Py_sum(n):
a = [i**2 for i in range(n)]
b = [i**3 for i in range(n)]
# 创建一个空列表,便于后续存储
ab_sum = []
for i in range(n):
# 将a、b中对应的元素相加
ab_sum.append(a[i]+b[i])
return ab_sum

调用实现函数

print(Py_sum(10))

2-Numpy实现:

def np_sum(n):
c = np.arange(n) ** 2
d = np.arange(n) ** 3
return c+d

print(np_sum(10))

易看出使用Numpy代码简洁且运行效率快

测试1000,10W,以及100W的运行时间

做绘图对比:

import pandas as pd

输入数据

py_times = [1.72*1000, 202*1000, 1.92*1000]
np_times = [18.8, 14.9*1000, 17.8*10000]

创建Pandas的DataFrame类型数据

ch_lxw = pd.DataFrame({
‘py_times’: py_times,
‘np_times’: np_times # 可加逗号
})

print(ch_lxw)



import matplotlib.pyplot as plt

线性图

print(ch_lxw.plot())

柱状图

print(ch_lxw.plot.bar())

简易箱线图

print(ch_lxw.boxplot)

plt.show()


##### 线性图运行效果如下:


![63](https://img-blog.csdnimg.cn/63a615f6bfca4383b25b65330e6927cb.png)


##### 柱状图运行效果如下:


![528](https://img-blog.csdnimg.cn/b34bb6a7af9c4d448ae51d213e41bdb0.png)




---


### 2 NumPy Ndarray 对象



> 
> NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
> 
> 
> 


* ndarray 对象是用于存放同类型元素的多维数组,其中的每个元素在内存中都有相同存储大小的区域。
* ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存块上,并且按照一定的布局对内存块进行排序(行或列)


**ndarray 内部由以下内容组成:**


* 一个指向数据(内存或内存映射文件中的一块数据)的指针;
* 数据类型或 dtype,描述在数组中的固定大小值的格子;
* 一个表示数组形状(shape)的元组,表示各维度大小的元组;
* 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。


### 相关学习、代码如下:



‘’’
创建一个 ndarray 只需调用 NumPy 的 array 函数即可:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

参数说明:

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

‘’’

ndarray 对象由计算机内存的连续一维部分组成,并结合索引模式,将每个元素映射到内存块中的一个位置。

内存块以行顺序(C样式)或列顺序(FORTRAN或MatLab风格,即前述的F样式)来保存元素

学好Numpy,便于后期对Pandas的数据处理

1:一维

import numpy as np

lxw = np.array([5, 2, 0])
print(lxw)

print()

2: 多于一个维度

import numpy as np

lxw2 = np.array([[1, 5, 9], [5, 2, 0]])
print(lxw2)

print()

3: 最小维度

import numpy as np

lxw3 = np.array([5, 2, 0, 1, 3, 1, 4], ndmin=2) # ndmin: 指定生成数组的最小维度
print(lxw3)

print()

4: dtype参数

import numpy as np

lxw4 = np.array([3, 3, 4, 4], dtype=complex) # dtype: 数组元素的数据类型[complex 复数】
print(lxw4)




---


### 3 Numpy 数据类型:



> 
> numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型.
> 
> 
> 


常用 NumPy 基本类型


**名称** **描述**  
 bool\_ :【布尔型数据类型(True 或者 False)】  
 int\_ : 【默认的整数类型(类似于 C 语言中的 long,int32 或 int64)】  
 intc :【与 C 的 int 类型一样,一般是 int32 或 int 64】  
 intp :【用于索引的整数类型(类似于 C 的 ssize\_t,一般情况下仍然是 int32 或 int64)】  
 int8 :【字节(-128 to 127)】  
 int16 :【整数(-32768 to 32767)】  
 int32 :【整数(-2147483648 to 2147483647)】  
 int64 :【整数(-9223372036854775808 to 9223372036854775807)】  
 uint8 :【无符号整数(0 to 255)】  
 uint16 :【无符号整数(0 to 65535)】  
 uint32 :【无符号整数(0 to 4294967295)】  
 uint64 :【无符号整数(0 to 18446744073709551615)】  
 float\_ float64 :【类型的简写】  
 float16 :【半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位】  
 float32 :【单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位】  
 float64 :【双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位】  
 complex\_ complex128: 【类型的简写,即 128 位复数】  
 complex64 :【复数,表示双 32 位浮点数(实数部分和虚数部分)】  
 complex128 :【复数,表示双 64 位浮点数(实数部分和虚数部分)】


### 相关学习、代码如下:



‘’’

numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。

‘’’

# Numpy 类型对象:
‘’’
dtype 对象是使用以下语法构造的:

numpy.dtype(object, align, copy)

object - 要转换为的数据类型对象
align - 如果为 true,填充字段使其类似 C 的结构体。
copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用

‘’’

1: 使用标量类型

import numpy as np

lxw = np.dtype(np.int32)
print(lxw)

print()

2: int8, int16, int32, int64 四种数据类型可以使用字符串 ‘i1’, ‘i2’,‘i4’,‘i8’ 代替

import numpy as np

lxw2 = np.dtype(‘i8’) # int64
print(lxw2)

print()

3: 字节顺序标注

import numpy as np

lxw3 = np.dtype(‘<i4’) # int32
print(lxw3)

print()

4: 首先创建结构化数据类型

import numpy as np

lxw4 = np.dtype([(‘age’, np.int8)]) # i1
print(lxw4)

print()

5: 将数据类型应用于 ndarray 对象

import numpy as np

lxw5 = np.dtype([(‘age’, np.int32)])
a = np.array([(10,), (20,), (30,)], dtype=lxw5)
print(a)

print()

6: 类型字段名可以用于存取实际的 age 列

import numpy as np

lxw6 = np.dtype([(‘age’, np.int64)])
a = np.array([(10,), (20,), (30,)], dtype=lxw6)
print(a[‘age’])

print()

7: 定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 dtype 应用到 ndarray 对象

import numpy as np

student = np.dtype([(‘name’, ‘S20’), (‘age’, ‘i2’), (‘marks’, ‘f4’)])
print(student) # 运行结果:[(‘name’, ‘S20’), (‘age’, ‘<i2’), (‘marks’, ‘<f4’)]

print()

8:

import numpy as np

student2 = np.dtype([(‘name’,‘S20’), (‘age’, ‘i1’), (‘marks’, ‘f4’)])
lxw = np.array([(‘lxw’, 21, 52), (‘cw’, 22, 58)], dtype=student2)
print(lxw) # 运行结果:[(b’lxw’, 21, 52.) (b’cw’, 22, 58.)]

每个内建类型都有一个唯一定义它的字符代码,如下:

‘’’
字符 对应类型
b 布尔型
i.csv (有符号) 整型
u 无符号整型 integer
f 浮点型
c 复数浮点型
m timedelta(时间间隔)
M datetime(日期时间)
O (Python) 对象
S, a (byte-)字符串
U Unicode
V 原始数据 (void)

‘’’




---


### 4 Numpy 数组属性



> 
> 在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。
> 
> 
> 


比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。


### 相关代码学习、如下



-*- coding = utf-8 -*-

@Time : 2022/6/28 16:52

@Author : lxw_pro

@File : Numpy-数组属性-4.py

@Software : PyCharm

NumPy 的数组中比较重要 ndarray 对象属性有:

‘’’
属性 说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

‘’’

ndarray.ndim

ndarray.ndim 用于返回数组的维数,等于秩。

import numpy as np

lxw = np.arange(36)
print(lxw.ndim) # a 现只有一个维度

现调整其大小

a = lxw.reshape(2, 6, 3) # 现在拥有三个维度
print(a.ndim)

print()

ndarray.shape

ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。比如,一个二维数组,其维度表示"行数"和"列数"。

ndarray.shape 也可以用于调整数组大小。

import numpy as np

lxw2 = np.array([[169, 175, 165], [52, 55, 50]])
print(lxw2.shape) # shape: 数组的维度

print()

调整数组大小:

import numpy as np

lxw3 = np.array([[123, 234, 345], [456, 567, 789]])
lxw3.shape = (3, 2)
print(lxw3)

print()

NumPy 也提供了 reshape 函数来调整数组大小:

import numpy as np

lxw4 = np.array([[23, 543, 65], [32, 54, 76]])
c = lxw4.reshape(2, 3) # reshape: 调整数组大小
print©

print()

ndarray.itemsize

ndarray.itemsize 以字节的形式返回数组中每一个元素的大小。

例如,一个元素类型为 float64 的数组 itemsize 属性值为 8(float64 占用 64 个 bits,

每个字节长度为 8,所以 64/8,占用 8 个字节),又如,一个元素类型为 complex32 的数组 item 属性为 4(32/8)

import numpy as np

数组的 dtype 为 int8(一个字节)

x = np.array([1, 2, 3, 4, 5], dtype=np.int8)
print(x.itemsize)

数组的dtypy现在为float64(八个字节)

y = np.array([1, 2, 3, 4, 5], dtype=np.float64)
print(y.itemsize) # itemsize: 占用字节个数

拓展:

整体转化为整数型

print(np.array([3.5, 6.6, 8.9], dtype=int))

设置copy参数,默认为True

a = np.array([2, 5, 6, 8, 9])
b = np.array(a) # 复制a
print(b) # 控制台打印b
print(f’a: {id(a)}, b: {id(b)}') # 可打印出a和b的内存地址

print(‘=’*20)

类似于列表的引用赋值

b = a
print(f’a: {id(a)}, b: {id(b)}')

创建一个矩阵

lxw5 = np.mat([1, 2, 3, 4, 5])
print(type(lxw5)) # 矩阵类型: <class ‘numpy.matrix’>

复制出副本,并保持原类型

yy = np.array(lxw5, subok=True)
print(type(yy))

只复制副本,不管其类型

by = np.array(lxw5, subok=False) # False: 使用数组的数据类型
print(type(by))

print(id(yy), id(by))

print(‘=’*20)

使用数组的copy()方法:

c = np.array([2, 5, 6, 2])
cp = c.copy()
print(id©, id(cp))

print()

ndarray.flags

‘’’
ndarray.flags 返回 ndarray 对象的内存信息,包含以下属性:

属性 描述
C_CONTIGUOUS © 数据是在一个单一的C风格的连续段中
F_CONTIGUOUS (F) 数据是在一个单一的Fortran风格的连续段中
OWNDATA (O) 数组拥有它所使用的内存或从另一个对象中借用它
WRITEABLE (W) 数据区域可以被写入,将该值设置为 False,则数据为只读
ALIGNED (A) 数据和所有元素都适当地对齐到硬件上
UPDATEIFCOPY (U) 这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新

‘’’

import numpy as np

lxw4 = np.array([1, 3, 5, 6, 7])
print(lxw4.flags) # flags: 其内存信息


`学习来源于哔哩哔哩和菜鸟教程`  
 学习可自行点击:[【菜鸟教程】](https://bbs.csdn.net/topics/618545628)  
 [【2022B站最新最好的数据分析课程推荐】](https://bbs.csdn.net/topics/618545628)




---


## Pandas学习


当然,做这些的前提是首先把文件准备好


##### 文件准备


*文件太长,故只截取了部分,当然,此文件可自行弄类似的也可以!*  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/60727b79d0464af0b9e30e4fb5ad6919.png)


### 1 pandas新增数据列



> 
> 在进行数据分析时,经常需要按照一定条件创造新的数据列,然后再进一步分析
> 
> 
> 


* 直接赋值
* df.apply()方法
* df.assign()方法
* 按条件进行分组分别赋值



-*- coding = utf-8 -*-

@Time : 2022/6/28 16:20

@Author : lxw_pro

@File : pandas新增数据列.py

@Software : PyCharm

1:

import pandas as pd

读取数据

lxw = pd.read_csv(‘sites.csv’)

print(lxw.head())

df = pd.DataFrame(lxw)

print(df)

df[‘lrl’] = df[‘lrl’].map(lambda x: x.rstrip(‘%’))

print(df)

df.loc[:, ‘jf’] = df[‘yye’] - df[‘sku_cost_prc’]

返回的是Series

print(df.head())

2:

def get_cha(n):
if n[‘yye’] > 5:
return ‘高价’
elif n[‘yye’] < 2:
return ‘低价’
else:
return ‘正常价’

df.loc[:, ‘yye_type’] = df.apply(get_cha, axis=1)

print(df.head())

print(df[‘yye_type’].value_counts())

3:

可同时添加多个新列

print(df.assign(
yye_bh=lambda x: x[‘yye’]*2-3,
sl_zj=lambda x: x[‘sku_cnt’]*6
).head(10))

4:

按条件先选择数据,然后对这部分数据赋值新列

先创建空列

df[‘zyye_type’] = ‘’

df.loc[df[‘yye’] - df[‘sku_cnt’]>8, ‘zyye_type’] = ‘高’
df.loc[df[‘yye’] - df[‘sku_cnt’] <= 8, ‘zyye_type’] = ‘低’

print(df.head())


下面分别是每个小问对应运行效果:


1:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/60b8dc9091374f2a9bdf8ac9b06b5d12.png)


2:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b118dd18ca11410ba8f8d349165a9c6a.png)


3:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/00998b45c7e044f59403f190f9cb4cef.png)


4:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/eef50bb3ff15428b8b68f31ee997b0d7.png)




---


![img](https://img-blog.csdnimg.cn/img_convert/80bace7084ffbcdac80fc374a9ed765a.png)
![img](https://img-blog.csdnimg.cn/img_convert/6910c2dca37d5e58d0e08954f1732759.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

a9bdf8ac9b06b5d12.png)


2:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b118dd18ca11410ba8f8d349165a9c6a.png)


3:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/00998b45c7e044f59403f190f9cb4cef.png)


4:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/eef50bb3ff15428b8b68f31ee997b0d7.png)




---


[外链图片转存中...(img-EErfrfOT-1714268951673)]
[外链图片转存中...(img-oWoiyCcp-1714268951673)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值