利用Python进行数据分析_Pandas_Numpy高级应用

发布时间 2023-12-20 15:53:07作者: 空空空空空空空空空空

Numpy高级应用

1.ndarray对象内部机理

import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import warnings
warnings.filterwarnings("ignore")

2.高级数组操作

arr = np.arange(8)
arr
array([0, 1, 2, 3, 4, 5, 6, 7])
arr_new = arr.reshape((4,2))
arr_new
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])
arr
array([0, 1, 2, 3, 4, 5, 6, 7])
# 数组的合并
a1 = np.arange(6).reshape(2,3)
a2 = np.arange(6).reshape(2,3)
a1
array([[0, 1, 2],
       [3, 4, 5]])
a2
array([[0, 1, 2],
       [3, 4, 5]])
a = np.concatenate([a1,a2],axis=0)
a
array([[0, 1, 2],
       [3, 4, 5],
       [0, 1, 2],
       [3, 4, 5]])
b = np.concatenate([a1,a2],axis=1)
b
array([[0, 1, 2, 0, 1, 2],
       [3, 4, 5, 3, 4, 5]])
# 数组的拆分
b
array([[0, 1, 2, 0, 1, 2],
       [3, 4, 5, 3, 4, 5]])
c1,c2,c3 = np.hsplit(b,[2,4])
c1
array([[0, 1],
       [3, 4]])
c2
array([[2, 0],
       [5, 3]])
c3
array([[1, 2],
       [4, 5]])

3.广播

b
array([[0, 1, 2, 0, 1, 2],
       [3, 4, 5, 3, 4, 5]])
b.mean()
2.5
demened = b-b.mean()
demened
array([[-2.5, -1.5, -0.5, -2.5, -1.5, -0.5],
       [ 0.5,  1.5,  2.5,  0.5,  1.5,  2.5]])

广播的原则

如果两个数组的后缘维度 (trailing dimension,即从末尾开始算起的维度) 的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失和 (或)长度为1的维度上进行。

c = np.arange(12).reshape((4,3))
c
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

mean(0) 表示沿着第一个轴(通常是行)计算均值。对于一个矩阵,这将返回每列的均值。
mean(1) 表示沿着第一个轴(通常是列)计算均值。对于一个矩阵,这将返回每行的均值。
例如, 如果 c 是一个 3x4 的矩阵,c.mean(0) 将返回一个包含 4 个元素的数组,每个元素是相应列的均值。

row_means_x = c.mean(1)
row_means_x
array([ 1.,  4.,  7., 10.])
row_means_y = c.mean(0)
row_means_y
array([4.5, 5.5, 6.5])
row_means_x.reshape((4,1))
array([[ 1.],
       [ 4.],
       [ 7.],
       [10.]])
demened = c - row_means_x.reshape((4,1))
demened
array([[-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.]])

案例

import numpy as np

# 创建一个三维数组 A,形状为 (3, 1, 4)
A = np.array([[[1, 2, 3, 4]] * 1, [[5, 6, 7, 8]] * 1, [[9, 10, 11, 12]] * 1])

# 创建一个一维数组 B,形状为 (4,)
B = np.array([0, 1, 2, 3])

# 广播数组 B 到数组 A
result = A + B

# 输出结果
print(result)

[[[ 1  3  5  7]]

 [[ 5  7  9 11]]

 [[ 9 11 13 15]]]

假设我们有一个三维数组 A 和一个二维数组 B,它们的形状分别为 (3, 2, 4) 和 (2, 4)。我们将尝试对它们进行相加操作,利用广播规则。

import numpy as np

# 创建一个三维数组 A,形状为 (3, 2, 4)
A = np.random.randint(1, 10, size=(3, 2, 4))

# 创建一个二维数组 B,形状为 (2, 4)
B = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8]])

# 广播数组 B 到数组 A
result = A + B

# 输出原始数组 A 和 B
print("Array A:")
print(A)
print("\nArray B:")
print(B)

# 输出广播后的结果数组
print(result)

Array A:
[[[7 6 2 3]
  [3 6 9 3]]

 [[4 6 6 9]
  [9 8 9 7]]

 [[3 7 1 7]
  [2 2 2 8]]]

Array B:
[[1 2 3 4]
 [5 6 7 8]]

Broadcasted Result:
[[[ 8  8  5  7]
  [ 8 12 16 11]]

 [[ 5  8  9 13]
  [14 14 16 15]]

 [[ 4  9  4 11]
  [ 7  8  9 16]]]