Python 商务数据分析—— NumPy 学习笔记Ⅱ

发布于:2025-06-24 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、 数组元素值的替换

我们可以使用索引或 where () 函数来替换 NumPy 数组中的元素值。

1.1 方式一:索引
import numpy as np


np.random.seed(42)


a3 = np.random.randint(0, 10, size=(3, 4))


print("原数组:\n", a3)


a3\[1] = 0  # 将a3数组第一行数据全部更换为0


print("替换后数组:\n", a3)


a3\[1] = np.array(\[1, 2, 3, 4])  # 将a3数组第一行数据更换为 \[1, 2, 3, 4]


print("再次替换后数组:\n", a3)
1.2 方式二:条件索引
import numpy as np


np.random.seed(42)


a3 = np.random.randint(0, 10, size=(3, 4))


print("原数组:\n", a3)


a3\[a3 < 3] = 1  # 数组中值小于3的元素全部替换为1


print("条件替换后数组:\n", a3)
1.3 方式三:where () 函数
import numpy as np


np.random.seed(42)


a3 = np.random.randint(0, 10, size=(3, 4))


print("原数组:\n", a3)


result = np.where(a3 < 5, 0, 1)  # 将a3数组中小于5的值替换为0,剩余值替换为1


print("使用where()替换后数组:\n", result)

二、 数组的广播机制

数组的广播机制允许形状不同的数组进行运算,只要它们的形状是兼容的。广播机制的基本原则是:如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相同或其中一方的长度为 1,则认为它们是广播兼容的。广播会在缺失和(或)长度为 1 的维度上进行。

2.1 广播原则
  • 如果两个数组的后缘维度的轴长度相同或其中一方的长度为 1,则认为它们是广播兼容的。

  • 广播会在缺失和(或)长度为 1 的维度上进行。

示例:

  • shape 为 (3,8,2) 的数组能和 shape 为 (8,1) 的数组进行运算吗?是。

  • shape 为 (3,1,8) 的数组能和 shape 为 (8,1) 的数组进行运算吗?是。

2.2 数组与数字运算
import numpy as np


a = np.random.randint(0, 5, size=(3, 5))


print(a)


a = a \* 2.345


print(a.round(2))  # 数组中的所有元素都乘以2.345,并保留2位小数
2.3 数组与数组运算
import numpy as np


a1 = np.random.randint(0, 5, size=(3, 5))


a2 = np.random.randint(0, 5, size=(3, 5))


print(a1 + a2)  # 数组形状一致时,各个元素相加减(满足数组广播机制)


a3 = np.random.randint(0, 5, size=(3, 4))


\# a1 + a3  # 报错,形状不一致的数组不能相加减(不满足数组广播机制)

三、 数组形状的操作

3.1 数组形状的改变

(1) reshape 与 resize

import numpy as np


a1 = np.random.randint(0, 10, size=(3, 4))


print(a1)


a2 = a1.reshape((2, 6))  # reshape是将数组转换成指定的形状,然后返回转换后的结果,原数组的形状不会发生改变


print(a2)


a1.resize((4, 3))  # resize是将数组转换成指定的形状,会直接修改数组本身,并且不会返回任何值


print(a1)

(2) flatten 与 ravel

import numpy as np


a3 = np.array(\[\[6, 9, 1, 6], \[4, 9, 4, 8], \[7, 0, 6, 0]])


print(a3)


a4 = a3.flatten()  # flatten将多维数组转换为一维数组,并返回一个拷贝,后续对这个返回值的修改不会影响原数组


a4\[0] = 100


print("flatten后:", a4)


print("原数组\[0,0]:", a3\[0, 0])


a5 = a3.ravel()  # ravel将多维数组转换为一维数组,并返回一个视图,后续对这个返回值的修改会影响原数组


a5\[0] = 200


print("ravel后:", a5)


print("原数组\[0,0]:", a3\[0, 0])
3.2 数组的叠加

(1) 垂直方向叠加的两种方式

import numpy as np


v1 = np.random.randint(0, 10, size=(3, 4))


v2 = np.random.randint(0, 10, size=(2, 4))


v3 = np.vstack(\[v1, v2])  # 垂直方向叠加


v4 = np.concatenate(\[v1, v2], axis=0)  # 垂直方向叠加


print(v3)


print(v4)

(2) 水平方向叠加的两种方式

import numpy as np


h1 = np.array(\[\[5, 0, 8, 6], \[8, 5, 1, 8], \[4, 3, 6, 3]])


h2 = np.array(\[\[4], \[5], \[3]])


h3 = np.hstack(\[h1, h2])  # 水平方向叠加


h4 = np.concatenate(\[h1, h2], axis=1)  # 水平方向叠加


print(h3)


print(h4)

(3) 先将数据拉伸转换成一维数组,再拼接

import numpy as np


np.random.seed(42)


h1 = np.random.randint(0, 10, size=(3, 4))


h2 = np.random.randint(0, 10, size=(3, 1))


h5 = np.concatenate(\[h1, h2], axis=None)  # 先拉伸转换成一维数组,再拼接


print(h5)
3.3 数组的切割

(1) 水平方向切割

import numpy as np


np.random.seed(42)


hs1 = np.random.randint(0, 10, size=(3, 4))


print(hs1)


print(np.hsplit(hs1, 2))  # 水平方向平均分为2份(要求列数可被2整除)


print(np.hsplit(hs1, (1, 2)))  # 水平方向分为1,1,2列(在下标为1,2处切割)

(2) 垂直方向切割

import numpy as np


vs1 = np.array(\[\[6, 3, 7, 4, 6], \[9, 2, 6, 7, 4], \[3, 7, 7, 2, 5], \[4, 1, 7, 5, 1]])


print(vs1)


print(np.vsplit(vs1, 4))  # 垂直方向平均分为4份


print(np.vsplit(vs1, (1, 3)))  # 垂直方向分为1,2,1份(在下标为1,3处切割)

(3) 指定切割方式

import numpy as np


arr = np.array(\[\[1, 2, 7, 9], \[9, 7, 7, 8], \[3, 1, 2, 6]])


print(np.split(arr, 4, axis=1))  # 按列平均切割


print(np.split(arr, 4, axis=0))  # 按行平均切割
3.4 矩阵转置

(1) 通过 ndarray.T 进行转置

import numpy as np


t1 = np.random.randint(0, 10, size=(3, 4))


print(t1)


print(t1.T)  # 数组t1转置


print(t1.dot(t1.T))  # 矩阵相乘

(2) 通过 ndarray.transpose () 进行转置

import numpy as np


t2 = t1.transpose()


t2\[0, 0] = 99  # 修改会影响原来的数组


print(t2)


print(t1)

四、 Axis 理解

在 NumPy 中,axis 是指数组的某个维度,用于指定对数组进行操作时沿着哪个维度进行操作。

4.1 Axis

axis 用于指定轴是行还是列,默认 axis=0。axis=0 代表沿着行的方向进行操作,axis=1 代表沿着列的方向进行操作。

(1) 求 x 数组在 axis=0 和 axis=1 两种情况下的和

import numpy as np


x = np.array(\[\[0, 1], \[2, 3]])


print(x.sum(axis=0))  # 按列求和


print(x.sum(axis=1))  # 按行求和

(2) 用 np.max 求 axis=0 和 axis=1 两种情况下的最大值

import numpy as np


np.random.seed(100)


x = np.random.randint(1, 10, size=(3, 5))


print(x)


print(x.max(axis=0))  # 按列求最大值


print(x.max(axis=1))  # 按行求最大值

(3) 用 np.delete 在 axis=0 和 axis=1 两种情况下删除元素

import numpy as np


np.random.seed(100)


x = np.random.randint(1, 10, size=(3, 5))


print(x)


print(np.delete(x, 0, axis=0))  # 删除第0行


print(np.delete(x, 0, axis=1))  # 删除第0列


网站公告

今日签到

点亮在社区的每一天
去签到