一、 数组元素值的替换
我们可以使用索引或 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列