文章目录
三 Python数据科学工具
1.Numpy
1.1 数组的创建
1)np.array()
import numpy as np
a = [1, 2, 3, 4]
arr = np.array(a)
print(arr)
2)arange、linspace、logspace
np.arange(start, stop, step)
:创建一个一维数组,其中的值是从start
到stop
(不包括stop
)的等差数列,步长为step
。np.linspace(start, stop, num)
:创建一个一维数组,其中的值是从start
到stop
(包括stop
)的等间距数列,数列中包含num
个值。np.logspace(start, stop, num, base)
:创建一个一维数组,其中的值是从base
的start
次方到base
的stop
次方(包括stop
),数列中包含num
个值。
import numpy as np
# 创建一个等差数列
arr1 = np.arange(0, 10, 2)
print(arr1) # [0 2 4 6 8]
# 创建一个等间距数列
arr2 = np.linspace(0, 1, 5)
print(arr2) # [0. 0.25 0.5 0.75 1. ]
# 创建一个对数间距数列
arr3 = np.logspace(0, 2, 3, base=10)
print(arr3) # [ 1. 10. 100.]
3)创建特定数组
np.zeros(shape)
:创建一个所有元素都为0的数组,其中shape
是数组的形状,可以是一个整数、元组或列表。np.ones(shape)
:创建一个所有元素都为1的数组,形状同上。np.identity(n)
:创建一个n×n的单位矩阵(即对角线上的元素为1,其余元素为0的矩阵)。np.empty(shape)
:创建一个指定形状的空数组,其中的元素值可能是未初始化的随机数据。np.diag(v, k=0)
:创建一个以v为对角线元素的对角矩阵,其中k表示对角线的偏移量,可以为正(表示在主对角线之上)或者负(表示在主对角线之下)。
import numpy as np
# 创建一个所有元素都为0的3×3数组
arr1 = np.zeros((3, 3))
print(arr1)
'''
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
'''
# 创建一个所有元素都为1的2×2数组
arr2 = np.ones([2, 2])
print(arr2)
'''
[[1. 1.]
[1. 1.]]
'''
# 创建一个4×4的单位矩阵
arr3 = np.identity(4)
print(arr3)
'''
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
'''
# 创建一个2×3的空数组
arr4 = np.empty((2, 3))
print(arr4)
'''
[[1. 1. 1.]
[1. 1. 1.]]
'''
# 创建一个以[1, 2, 3]为对角线元素的对角矩阵
arr5 = np.diag([1, 2, 3])
print(arr5)
'''
[[1 0 0]
[0 2 0]
[0 0 3]]
'''
1.2 数组元素的访问
-
下标或切片:
例如,对于一维数组arr,可以使用arr[0]来访问第一个元素,使用arr[1:3]来访问第2到第4个元素。
-
整数序列:
可以使用整数序列来访问任意元素,例如arr[[0, 2, 3]]将返回第1、3、4个元素组成的数组。
-
布尔数组:
可以使用一个布尔数组进行索引,数组中为True的位置对应的元素会被提取出来,例如arr[arr > 5]将返回所有大于5的元素
import numpy as np
# 创建一个一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
'''
[1 2 3 4 5]
'''
# 创建一个二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2)
'''
[[1 2 3]
[4 5 6]
[7 8 9]]
'''
# 使用下标或切片访问数组元素
print(arr1[0]) # 输出第一个元素
print(arr2[1, 2]) # 输出第二行第三列的元素
'''
1
6
'''
# 使用整数序列访问数组元素
print(arr1[[0, 2, 4]]) # 输出第1、3、5个元素
print(arr2[[0, 2], [1, 2]]) # 输出(0,1)和(2,2)位置的元素
'''
[1 3 5]
[2 9]
'''
# 使用布尔数组访问数组元素
print(arr1[arr1 > 3]) # 输出大于3的元素
print(arr2[arr2 % 2 == 0]) # 输出所有偶数元素
'''
[12 15 18]
[2. 5. 8.]
'''
1.3 多维数组的axis参数
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 沿着行的方向对数组求和
print(np.sum(arr, axis=0)) # 输出[12 15 18]
# 沿着列的方向对数组求和
print(np.sum(arr, axis=1)) # 输出[ 6 15 24]
# 沿着行的方向对数组求平均值
print(np.mean(arr, axis=0)) # 输出[4. 5. 6.]
# 沿着列的方向对数组求平均值
print(np.mean(arr, axis=1)) # 输出[2. 5. 8.]
# 沿着第三个维度求和,但该数组只有两个维度,所以会报错
try:
print(np.sum(arr, axis=2))
except Exception as e:
print(str(e)) # 输出"axis 2 is out of bounds for array of dimension 2"
# 沿着负数的维度求和,即从后往前数的第二个维度
print(np.sum(arr, axis=-2)) # 输出[12 15 18]
1.4 ufunc运算
import numpy as np
# 创建两个一维数组
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
# 加法
print(x + y) # 输出[5 7 9]
# 减法
print(x - y) # 输出[-3 -3 -3]
# 乘法
print(x * y) # 输出[ 4 10 18]
# 除法
print(x / y) # 输出[0.25 0.4 0.5 ]
# 幂运算
print(x ** 2) # 输出[1 4 9]
# 正弦函数
print(np.sin(x)) # 输出[0.84147098 0.90929743 0.14112001]
# 余弦函数
print(np.cos(y)) # 输出[-0.65364362 0.28366219 0.96017029]
# 平方根函数
print(np.sqrt(x)) # 输出[1. 1.41421356 1.73205081]
# 指数函数
print(np.exp(y)) # 输出[ 54.59815003 148.4131591 403.42879349]
# 自然对数函数
print(np.log(y)) # 输出[1.38629436 1.60943791 1.79175947]
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 沿着行的方向对数组求和
print(np.sum(arr, axis=0)) # 输出[12 15 18]
# 沿着列的方向对数组求平均值
print(np.mean(arr, axis=1)) # 输出[2. 5. 8.]
1.5 向量与矩阵运算
1)向量内积
import numpy as np
x1 = np.array([1, 2, 3])
x2 = np.array([4, 5, 6])
print(np.dot(x1, x2))
# 输出32(1*4 + 2*5 + 3*6)
2)矩阵基本运算
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(a + b) # 对应位置相加
# 输出 [[ 6 8]
# [10 12]]
print(a - b) # 对应位置相减
# 输出 [[-4 -4]
# [-4 -4]]
print(a * b) # 对应位置相乘
# 输出 [[ 5 12]
# [21 32]]
print(b / a) # 对应位置相除
# 输出 [[5. 3. ]
# [2.33333333 2. ]]
print(b // a) # 对应位置整除
# 输出 [[5 3]
# [2 2]]
print(b % a) # 对应位置取模
# 输出 [[0 0]
# [1 0]]
print(a ** 2) # 幂运算
# 输出 [[ 1 4]
# [ 9 16]]
print(a @ b) # 矩阵乘积
# 输出 [[19 22]
# [43 50]]
3)矩阵转置
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.T)
# 输出 [[1 4]
# [2 5]
# [3 6]]
4)数据排序
import numpy as np
a = np.array([3, 1, 2])
print(np.sort(a)) # 升序排序,输出[1 2 3]
print(np.sort(a)[::-1]) # 降序排序,输出[3 2 1]
import numpy as np
a = np.array([[3, 2], [1, 4]])
print(np.sort(a, axis=0)) # 对列排序,输出[[1 2] [3 4]]
print(np.sort(a, axis=1)) # 对行排序,输出[[2 3] [1 4]]
2.Pandas
2.1 Series
- 创建
import pandas as pd
data = pd.Series([0.25, 0.5, 0.75, 1.0])
print(data)
'''
0 0.25
1 0.50
2 0.75
3 1.00
dtype: float64
'''
-
访问元素
import pandas as pd data = pd.Series([0.25, 0.5, 0.75, 1.0]) print(data[0]) # 输出第一个元素 ''' 0.25 ''' print(data[:2]) # 输出前两个元素 ''' 0 0.25 1 0.50 dtype: float64 ''' print(data[[1,3]]) # 输出第二个和第四个元素 ''' 1 0.50 3 1.00 dtype: float64 '''
2.2 DataFrame
- 定义
import pandas as pd
data = {'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40],
'gender': ['F', 'M', 'M', 'F']}
df = pd.DataFrame(data)
print(df)
'''
name age gender
0 Alice 25 F
1 Bob 30 M
2 Charlie 35 M
3 David 40 F
'''
-
访问元素
import pandas as pd data = {'name': ['Alice', 'Bob', 'Charlie', 'David'], 'age': [25, 30, 35, 40], 'gender': ['F', 'M', 'M', 'F']} df = pd.DataFrame(data) print(df['name']) # 输出name这一列的所有元素 ''' 0 Alice 1 Bob 2 Charlie 3 David Name: name, dtype: object ''' print(df.loc[1]) # 输出第二行的所有元素 ''' name Bob age 30 gender M Name: 1, dtype: object ''' print(df.iloc[0:2, 1:]) # 输出前两行,从第二列开始的所有元素 ''' age gender 0 25 F 1 30 M '''
2.3 布尔类型数组索引
-
对Series
import pandas as pd data = pd.Series([0.25, 0.5, 0.75, 1.0]) bool_arr = [True, False, True, False] print(data[bool_arr]) # 输出第一和第三个元素 ''' 0 0.25 2 0.75 dtype: float64 '''
-
对DataFrame
import pandas as pd data = {'name': ['Alice', 'Bob', 'Charlie', 'David'], 'age': [25, 30, 35, 40], 'gender': ['F', 'M', 'M', 'F']} df = pd.DataFrame(data) bool_arr = [False, True, False, True] print(df[bool_arr]) # 输出第二和第四行的所有元素 ''' name age gender 1 Bob 30 M 3 David 40 F '''
[bool_arr]) # 输出第一和第三个元素
‘’’
0 0.25
2 0.75
dtype: float64
‘’’
* 对DataFrame
```python
import pandas as pd
data = {'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40],
'gender': ['F', 'M', 'M', 'F']}
df = pd.DataFrame(data)
bool_arr = [False, True, False, True]
print(df[bool_arr]) # 输出第二和第四行的所有元素
'''
name age gender
1 Bob 30 M
3 David 40 F
'''