一.Numpy(Numerical Python)
Numpy库是Python用于科学计算的基础包,也是大量Python数学和科学计算包的基础。不少数据处理和分析包都是在Numpy的基础上开发的,如后面介绍的Pandas包。
Numpy的核心基础是ndarray(N-dimensional array ,n维数组),即由数据类型相同的元素组成N维数组。
1.创建数组
1.利用array函数创建
python
import numpy as np
d1 = [1,2,3,4,0.1,7]
d2 = (1,3,5,7,9)
d3 = [(1,2),(3,4),[5,6]]
n1 = np.array(d1)
n2 = np.array(d2)
n3 = np.array(d3)
print(n1)
print(n2)
print(n3)
输出:
1. 2. 3. 4. 0.1 7.
1 3 5 7 9
\[1 2
3 4
5 6\]
python
print(n1.dtype)
print(n2.dtype)
print(n3.dtype)
输出:
float64
int64
int64
可以看出数组n1中的数据类型是浮点数,这是因为numpy会进行类型强制转换,转换规则为:str > float > int 只要原始数据中有一个类型"较高级"的数据,由这个原始数据创建的数组里面的元素就会开始强制转换类型
float64是一种浮点数类型,表示双精度浮点数,它占用64位(8字节)的存储空间
int64是一种整数类型,表示64位有符号整数。用于存储整数,能够表示的整数的范围为负2的63次方到正2的63次方减一,适用于需要处理较大范围的整数场景
还有其他的类型可以上网查(感叹现在的artifical intelligence)
另外有一个类型值得注意:object类型,称为对象类型,可以存储任何Python对象
2.利用内置函数创建数组
python
import numpy as np
z1 = np.zeros((3,4))
z2 = np.ones((2,3))
z3 = np.arange(1,10)
z4 = np.arange(1,10,2)
z5 = np.arange(10)
输出:(省略了print)
\[0. 0. 0. 0.
0. 0. 0. 0.
0. 0. 0. 0.\]
\[1. 1. 1.
1. 1. 1.\]
1 2 3 4 5 6 7 8 9
1 3 5 7 9
0 1 2 3 4 5 6 7 8 9
2.数组的属性
1. ndarray.shape
表示数组的维度大小(形状),返回一个元组,其中每一个元素对应了一个维度的大小
python
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape)
输出:(2,3)
2.ndarray.ndim
用于获取数组的维度(dimension)
3.ndarray.size
表示数组中元素总个数
4.ndarray.dtype
表示数组中的元素类型
5.ndarray,itemsiez
表示数组中每个元素所占的字节数
python
print(arr.itemsize)
输出:8
6.ndarray.nbytes
表示数组占用的字节总数
python
print(arr.nbytes)
输出:48
7.ndarray.T
表示数组的转置(行变成列,列变成行)
8.ndarray.real
获取数组中元素的实部
9.ndarray.imag
获取数组中元素的虚部
10.ndarray.flags ndarray.strides ndarray.data
这三个属性不常用,用到了再了解
3.数组的reshape函数
reshape本身就有重塑,改造的意思(shape 形状,塑造)
reshape函数用于在不改变数组数据的情况下,重新调整数组的形状,只要新形状的总数据量和原来形状的总数据量一致就行
在reshape方法中,-1参数可以让Numpy自动计算维度的大小,即根据数组中元素的总个数和其他维度的大小自动推导出该维度的大小。注意:当使用reshape方法时,只有一个维度大小可以设置成-1
4.数组中的视图(view)和副本(copy)
在Numpy中,视图和副本是是两种不同的数组操作方式,它们在数据存储和内存管理上有显著的区别
1.视图(view)
视图是原数组的一种"窗口",它并不创建新的数据存储,而是直接引用原数组的内存,对视图的修改会直接影响原数组
1.视图创建方式
使用切片操作[:]
使用reshape方法
使用transpose方法(转置)
2.视图的特点
不会占用额外的内存空间
修改视图中的数据会影响到原数组中的数据
python
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
view = arr.reshape((2, 3)) # 创建视图
print("Original array:", arr)
print("View array:", view)
# 修改视图
view[0, 0] = 100
print("Modified original array:", arr)
print("Modified view array:", view)
输出:
Original array: [1 2 3 4 5 6]
View array: [[1 2 3]
4 5 6\]
Modified original array: [100 2 3 4 5 6]
Modified view array: [[100 2 3]
4 5 6\]
2.副本(copy)
副本是原数组的一个完整拷贝,它在内存中创建了新的数据存储。对副本的修改不会影响原数组
1.副本的创建方式
使用.copy()方法
python
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
copy = arr.reshape((2, 3)).copy() # 创建副本
print("Original array:", arr)
print("Copy array:", copy)
# 修改副本
copy[0, 0] = 100
print("Modified original array:", arr)
print("Modified copy array:", copy)
输出:
Original array: [1 2 3 4 5 6]
Copy array: [[1 2 3]
4 5 6\]
Modified original array: [1 2 3 4 5 6]
Modified copy array: [[100 2 3]
4 5 6\]
3.如何判断一个数组是视图还是副本
使用ndarray.flags属性
如果OWNDATA=True 表示数组是副本,拥有自己的内存
如果OWNDATA=False 表示数组是视图,引用了其他数组的内存
5.可以使用astype方法修改数组的数据类型
ndarray.astype(dtype)
其中dtype表示要转换的数据类型
6.数组运算
基础的加减乘除乘方就不说了
np.srqt(ndarray)
np.abs(ndarray)
np.cos(ndarray)
np.sin(ndarray)
np.exp(ndarray)
7.数组的切片
看前面的文章
8.数组的连接
1.numpy.concatenate()
参数axis=0表示垂直拼接,axis=1表示水平拼接
2.numpy.vstack()
Vertical 垂直的
3.numpy.hstack()
Horizontal 水平的
注意:水平连接要求数组之间行数一致,垂直连接要求数组之间列数一致
python
import numpy as np
np.random.seed(42) # 设置随机数种子
n1 = np.random.randint(1,10,size=(2,3))
n2 = np.random.randint(2,20,size=(3,3))
n3 = np.random.randint(3,30,size=(2,4))
print(np.concatenate((n1,n2),axis=0)) # 垂直拼接
print(np.concatenate((n1,n3),axis=1)) # 水平拼接
输出:
\[ 7 4 8
5 7 3
12 12 5
9 4 3
13 7 3\]
\[ 7 4 8 23 3 14 28
5 7 3 24 14 27 19\]
python
print(np.vstack([n1,n2])) # 垂直拼接
print(np.hstack((n1,n3))) # 水平拼接
输出:
\[ 7 4 8
5 7 3
12 12 5
9 4 3
13 7 3\]
\[ 7 4 8 23 3 14 28
5 7 3 24 14 27 19\]
9.数组形态的转换
1.numpy.ravel()
将多维数组展平成一维数组
python
ravel_n1 = np.ravel(n1) # 展平
print(ravel_n1)
输出:
7 4 8 5 7 3
2.numpy.flatten()
将多维数组展平成一维数组
python
flatten_n2 = n2.flatten()
print(flaten_n2)
输出:
12 12 5 9 4 3 13 7 3
3.ndarray.reshape(-1)
python
reshape_n3 = n3.reshape(-1)
print(reshape_n3) # 展平,-1表示自动计算维度
输出:
23 3 14 28 24 14 27 19
二.Pandas
Pandas是基于Numpy开发的一个Python包。Pandas作为Python数据分析的核心包,提供了大量数据分析的函数,包括数据处理,数据抽取,数据集成,数据计算等基本数据分析手段。
Pandas核心数据结构包括序列和数据框。序列存储一维数据,而数据框可以存储更复杂的多维数据
1.数据框DataFrame的拼接
1.concat函数
python
import pandas as pd
import numpy as np
np.random.seed(42)
df1 = pd.DataFrame(data=np.random.randint(1,10,size=(3,2)))
df2 = pd.DataFrame(data=np.random.randint(1,10,size=(3,4)))
df3 = pd.DataFrame(data=np.random.randint(1,10,size=(4,2)))
print(df1)
print()
print(df2)
print()
print(df3)
# 按列拼接,axis=1,即按列对齐,也就是列索引对齐,还可以理解为横向拼接
print(pd.concat([df1,df2],axis=1))
print()
print(pd.concat([df1,df2],axis=1,ignore_index=True)) # 忽略索引,重新生成索引
print()
# 按行拼接,axis=0,即按行对齐,也就是行索引对齐,还可以理解为纵向拼接
print(pd.concat([df1,df3],axis=0))
输出:
0 1
0 7 4
1 8 5
2 7 3
0 1 2 3
0 7 8 5 4
1 8 8 3 6
2 5 2 8 6
0 1
0 2 5
1 1 6
2 9 1
3 3 7
0 1 0 1 2 3
0 7 4 7 8 5 4
1 8 5 8 8 3 6
2 7 3 5 2 8 6
0 1 2 3 4 5
0 7 4 7 8 5 4
1 8 5 8 8 3 6
2 7 3 5 2 8 6
0 1
0 7 4
1 8 5
2 7 3
0 2 5
1 1 6
2 9 1
3 3 7
到现在,对一些函数的参数axis有了一点新的理解:
axsi=0,表示对行进行操作,比如使用concat函数时设置axis=0表示按行拼接,就是把数据一行一行接上去,即垂直连接
axis=1则表示对列进行操作,使用concat函数时设置axis=1表示按列拼接,就是把数据一列一列接上去,即水平连接