多维数组定义
import numpy as np
# 多维数组定义
np.array((2, 3, 4)) # 类型为int32 的一维数组
np.array([2.0, 3.0, 4.0]) # 类型为flloat64 的一维数组
np.array(((2, 3, 4, 5), (4, 5, 6, 7))) # 类型为int32 的多维数组
float_array = np.array([[1, 2], [3, 4]], dtype="float64") # 指定多为数组类型
zero_array = np.zeros((3, 4)) # 全为 0 的多维数组,默认类型flloat64
one_array = np.ones((3, 4)) # 全为 1 的多维数组,默认类型flloat64
empty_array = np.empty((3, 4)) # 随机初始值 的多维数组,默认类型flloat64
array = np.full((3, 3), 2) # 填充为某个值
np.arange(10, 30, 5) # 第三个参数为步长
np.arange(0, 2, 0.3)
np.linspace(0.2, 0.3, 9) # 第三个参数为元素个数
多维数组的属性
# 多维数组的属性
arr = np.array([(2, 3, 4, 5), (4, 5, 6, 7)])
print(arr.ndim) # 2 多维数组的维数,或者说是'轴数'
print(arr.shape) # (2, 4) 多维数组整体的维度,或者说是多维数组的“形状”
print(arr.size) # 8 多维数组中元素的总个数
print(arr.dtype) # int32 多维数组中元素的数据类型
print(arr.itemsize) # 4 多维数组中每个元素的字节大小。
多维数组操作
# 多维数组降为一维数组 生成的原数组的视图,无需占有内存空间,但视图的改变会影响到原数组的变化。
print(arr.ravel())
# 多维数组降为一维数组 flatten方法返回的是真实值,其值的改变并不会影响原数组的更改
print(arr.flatten())
# 重整多维数组的大小,reshape还允许缺省 1 个参数(用-1占位),它会根据数组元素的总数和提供的其他参数自动求出一个合适的值
print(np.arange(12).reshape(2, 6))
print(np.arange(12).reshape(2, 3, 2))
print(np.arange(12).reshape(2, -1, 2))
# 返回数组的转置结果
print(arr.T)
# 横向拼接两个数组,但必须满足两个数组的行数相同
print(np.hstack((arr, arr)))
print(np.column_stack((arr, arr)))
# 纵向拼接两个数组,但必须满足两个数组的列数相同
print(np.vstack((arr, arr)))
print(np.row_stack((arr, arr)))
# 沿横轴分割数组
print(np.hsplit(arr, 3))
# 沿纵轴分割数组
print(np.vsplit(arr, 3))
# 将数组转换为列表
print(arr.tolist())
# 强制转换数组的数据类型
print(arr.astype(float))
数组索引
# 索引
arr = np.arange(9)
print(arr) # [0 1 2 3 4 5 6 7 8]
print(arr[2]) # 2
print(arr[-2]) # 7
print(arr[2:5]) # [2 3 4]
print(arr[1:7:2]) # [1 3 5]
print(arr[np.array((2, 4, 6))]) # [2 4 6] 使用数组来索引
arr.shape = (3, 3) # 等同于 arr = arr.reshape(3,3)
print(arr[1, 2]) # 5 推荐使用
print(arr[1, -1]) # 5 推荐使用
print(arr[0][1]) # 1 不推荐使用,效率较低
print(arr[0]) # [0 1 2] 返回数组的第1行
print(arr[:2]) # [[0 1 2] [3 4 5]] 返回数组的前2行
print(arr[[0, 2]]) # [[0 1 2] [6 7 8]] 返回指定的第1行和第3行
print(arr[:, 0]) # [0 3 6] 返回数组的第1列
print(arr[:, [0, 2]]) # [[0 2] [3 5] [6 8]] 返回数组的第1列和第3列
print(arr[np.array([0, 1]), np.array([0, 2])]) # [0 5]
# 布尔索引
b = arr % 2 == 0
print(b) # [[ True False True] [False True False] [ True False True]]
print(arr[b]) # [0 2 4 6 8]
print(arr[np.array([True, False, True])]) # [[0 1 2] [6 7 8]] 返回所有为True的对应行
c = np.array(["A", "B", "C"])
print(arr[c == "A"]) # [[0 1 2] [6 7 8]]
print(arr[(c == "A") | (c == "C")][:, [0, 2]]) # [[0 2] [6 8]]
# 花式索引
print(arr[[2, 0, 1]]) # [[6 7 8] [0 1 2] [3 4 5]] 按照指定顺序返回指定行
print(arr[[2, 0, 1]][:, [0, 2, 1]]) # [[6 8 7] [0 2 1] [3 5 4]]返回指定的行与列
print(arr[np.ix_([2, 1], [0, 2])]) # [[6 8] [3 5]] 返回指定的行与列
NumPy 字符串函数
# NumPy 字符串函数
print(np.char.add(["hello"], [" world"])) # ['hello world']
print(
np.char.add(["hello", "hi"], [" world", " lily"])
) # ['hello world' 'hi lily']
print(np.char.multiply("hello ", 3)) # hello hello hello
print(np.char.multiply(["hello", "hi"], 3)) # ['hellohellohello' 'hihihi']
print(np.char.center("hello", 7, fillchar="*")) # *hello*
print(np.char.center(["hello", "hi"], 6, fillchar="*")) # ['hello*' '**hi**']
print(np.char.capitalize("hello")) # Hello
print(np.char.title("i love china")) # I Love China
print(np.char.lower("GOOGLE")) # google
print(np.char.upper("google")) # GOOGLE
print(np.char.split("do you love china?")) # ['do', 'you', 'love', 'china?']
print(np.char.split("yes,i do", sep=",")) # ['yes', 'i do']
print(np.char.splitlines("I\rLove China")) # ['I', 'Love China'] 用换行符作为分隔符来分割字符串
print(np.char.splitlines("I\nLove China")) # ['I', 'Love China']
print(np.char.splitlines("I\r\nLove China")) # ['I', 'Love China']
print(
np.char.expandtabs("i\tlove\tchina", 3)
) # i love china 将字符串里面的 \t 转换成 N 个 tab
print(np.char.strip("it love china", "i")) # t love china
print(np.char.strip(["it", "love", "china"], "i")) # ['t' 'love' 'china']
print(np.char.lstrip(" china")) # china
print(np.char.rstrip("china ")) # china
print(np.char.join(":", "apple")) # a:p:p:l:e
print(np.char.join([":", "-"], ["apple", "pear"])) # ['a:p:p:l:e' 'p-e-a-r']
print(np.char.partition("apple", "p")) # ['a' 'p' 'ple']
print(
np.char.partition(["apple", "pear"], ["p", "p"])
) # [['a' 'p' 'ple'] ['' 'p' 'ear']]
print(np.char.replace("i love china", "ov", "ik")) # i like china
print(np.char.encode("中文", "utf-8")) # b'\xe4\xb8\xad\xe6\x96\x87'
a = np.char.encode("中文", "utf-8")
print(np.char.decode(a, "utf-8")) # 中文
NumPy 数学函数
# NumPy 数学函数
a = np.array([0, 30, 45, 60, 90])
sin = np.sin(a * np.pi / 180)
cos = np.cos(a * np.pi / 180)
tan = np.tan(a * np.pi / 180)
print(sin, cos, tan)
arcsin = np.arcsin(sin)
arccos = np.arccos(cos)
arctan = np.arctan(tan)
print(np.degrees(arcsin), np.degrees(arccos), np.degrees(arctan))
a = np.array([1, 2.0, 30.12, 129.567])
print(np.around(a)) # [1. 2. 30. 130.] 四舍五入
print(np.around(a, decimals=1)) # [1. 2. 30.1 129.6] 四舍五入
print(np.round(a)) # [1. 2. 30. 130.] 四舍五入
print(np.round(a, decimals=1)) # [1. 2. 30.1 129.6] 四舍五入
print(np.floor(a)) # [1. 2. 30. 129.]
print(np.ceil(a)) # [1. 2. 31. 130.]
a = np.arange(6, dtype=np.float_).reshape(2, 3)
b = np.array([2, 2, 2])
print(np.add(a, b)) # [[2. 3. 4.] [5. 6. 7.]]
print(np.subtract(a, b)) # [[-2. -1. 0.] [ 1. 2. 3.]]
print(np.multiply(a, b)) # [[ 0. 2. 4.] [ 6. 8. 10.]]
print(np.divide(a, b)) # [[0. 0.5 1. ] [1.5 2. 2.5]]
print(np.power(a, b)) # [[ 0. 1. 4.] [ 9. 16. 25.]]
print(np.mod(a, b)) # [[0. 1. 0.] [1. 0. 1.]]
a = np.array([1, 4, 9])
print(a**2) # [1 16 81] 计算每个元素的平方
print(np.sqrt(a)) # [1. 2. 3.] 计算每个元素的平方根
print(np.exp(a)) # 计算每个元素的指数值
print(np.log(a)) # 计算每个元素的自然对数值
print(np.abs(a)) # 计算每个元素的绝对值
NumPy 统计函数
# NumPy 统计函数
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.sum(a)) # 45 计算所有元素的和
print(np.sum(a, axis=0)) # [12 15 18] 对每一列求和
print(np.sum(a, axis=1)) # [ 6 15 24] 对每一行求和
print(np.cumsum(a)) # [ 1 3 6 10 15 21 28 36 45] 对每一个元素求累积和
print(np.cumsum(a, axis=0)) # [[ 1 2 3] [ 5 7 9] [12 15 18]] 计算每一列的累积和,并返回二维数组
print(np.cumsum(a, axis=1)) # [[ 1 3 6] [ 4 9 15] [ 7 15 24]] 计算每一行的累积和,并返回二维数组
print(np.cumprod(a)) # 对每一个元素求累积积
print(np.max(a)) # 计算所有元素的最大值
print(np.min(a)) # 计算所有元素的最小值
print(np.amin(a)) # 1
print(np.amin(a, axis=0)) # [1 2 3] 0轴最小值
print(np.amax(a, axis=1)) # [3 6 9] 1轴最大值
print(np.ptp(a)) # 8 计算数组中元素最大值与最小值的差
print(np.ptp(a, axis=1)) # [2 2 2]
print(np.percentile(a, 50)) # 5.0 百分位数
print(np.percentile(a, 50, axis=1)) # [2. 5. 8.] 百分位数
print(np.median(a)) # 5.0 中位数
print(np.median(a, axis=1)) # [2. 5. 8.] 中位数
print(np.mean(a)) # 5.0 算术平均值
print(np.mean(a, axis=1)) # 5.0 算术平均值
print(np.average(a)) # [2. 5. 8.] 加权平均值
print(np.average(a, weights=a)) # 6.333333333333333 加权平均值
print(np.average(a, weights=a, returned=True)) # (6.333333333333333, 45.0) 加权平均值
print(np.var(a)) # 6.666666666666667 方差
print(np.std(a)) # 2.581988897471611 标准差
print(np.where(a % 2 == 0, 1, 0)) # [[0 1 0] [1 0 1] [0 1 0]]
NumPy 排序函数、随机数函数、数组的交集并集
# NumPy 排序函数
a = np.array([[3, 7, 12, 45], [9, 1, 0, 34]])
print(np.sort(a))
print(np.sort(a, axis=0))
b = np.random.randint(1, 10, size=[10, 10])
print(b)
print(np.sort(b)) # 默认快速排序quicksort
print(np.sort(b, kind="heapsort"))
print(np.sort(b, kind="mergesort"))
dt = np.dtype([("name", "S10"), ("age", int)])
c = np.array([("lily", 21), ("rose", 25), ("daisy", 17), ("jane", 27)], dtype=dt)
print(np.sort(c, order="age")) # 按照字段排序
a = np.array([3, 4, 2])
b = np.argsort(a) # 返回排序的索引数组
print(b) # [2 0 1]
print(a[b]) # [2 3 4]
# 随机数生成
print(np.random.rand(size=[2, 2])) #
print(np.random.randint(1, 10, size=[2, 2])) # [[9 9] [1 7]]
print(np.random.normal(size=10)) # 生成正态随机数
print(np.random.binomial(9, 0.5, 10000)) # 生成二项分布随机数
a = np.array([[3, 7, 12, 5], [9, 5, 0, 3]])
print(np.unique(a)) # [ 0 3 5 7 9 12] 计算唯一元素,并返回有序结果
b = np.array([1, 2, 3, 5, 7])
print(np.intersect1d(a, b)) # [3 5 7] 计算公共元素,即交集
print(np.union1d(a, b)) # [ 0 1 2 3 5 7 9 12] 计算并集
print(np.setdiff1d(a, b)) # [ 0 9 12] 计算差集
print(np.setxor1d(a, b)) # [ 0 1 2 9 12] 计算对称差,即存在于一个数组中,但不同时存在于两个数组中
print(np.in1d(a, b)) # [True True False True False True False True] 判断a的元素是否包含于b中
NumPy 中的广播机制
# NumPy 中的广播机制
# NumPy 中,各种运算默认都是“逐元素”进行的。
# 在 NumPy 的广播机制中,有一个很重要的概念叫做“相容的形状”。只有当两个数组具有“相容的形状”时,“广播”才能起作用;
# 所谓“相容的形状”,指的是参与运算的这两个数组各个维度要么相等;要么其中一个数组的对应维度为 1(不存在的维度也是 1)。
# 而 NumPy 比较各个维度的顺序是从后往前,一次比较,就相当于把参与运算的数组形状右对齐,然后若相等就再往前看,若其中一个为 1 就将其在这个维度上扩展到更高的维度,直到第一个维度。
# 下面是对于上述规则一个更清晰的表述描述:
# Image (3d array): 256 x 256 x 3
# Scale (1d array): 3
# Result (3d array): 256 x 256 x 3
# A (4d array): 8 x 1 x 6 x 1
# B (3d array): 7 x 1 x 5
# Result (4d array): 8 x 7 x 6 x 5
a = np.arange(10).reshape(2, 5)
b = np.arange(5)
print(a + b) # [[ 0 2 4 6 8] [ 5 7 9 11 13]]
print(a * b) # [[ 0 1 4 9 16] [ 0 6 14 24 36]]