前言
这里是Numpy辟邪剑谱进阶篇,之前还有一篇入门篇,没看的同学可以点传送门:NumPy辟邪剑谱——入门篇。
再次声明,以下内容大多来自《利用python进行数据分析》一书,非常值得拥有的一本书。
1.bool过滤
# 1. bool过滤
names = np.array(['Ada', 'Bob', 'Jack', 'Joe', 'Bob', 'Will', 'Joe'])
data = np.random.randn(7, 4)
how_many_bob = names == 'Bob'
# print(how_many_bob) # 一个包含True or False的array,'Bob'所在的位置标为True,否则标为False。
# 将'Bob'的数据过滤出来
# bob_data = data[how_many_bob]
# print(bob_data)
# 如果我想拿到'Bob'的前3列数据呢?
# bob_data_column3 = data[how_many_bob, :3]
# print(bob_data_column3)
# 如果我只想拿到'Bob'的第3列数据呢?
# bob_data_column2 = data[how_many_bob, 2]
# print(bob_data_column2)
# 如果我想拿到除了'Bob'之外其他人的数据呢?需要用到 != 或者 ~
# ~ 符号,在对通用条件进行取反时比较常用。
# except_bob_data1 = data[names != 'Bob']
# print(except_bob_data1)
#
# except_bob_data2 = data[~(names == 'Bob')]
# print(except_bob_data2)
# 如果我需要拿到'Bob'和'Joe'的数据呢?
# 就需要让多个bool条件联合,需要用到数学操作符 &(and) 和 |(or)
# Note: Python中的 and 和 or 在这里是没有作用的,只能用 & 和 | 操作符
# mask = (names == 'Bob') | (names == 'Joe')
# bob_joe_data = data[mask]
# print(bob_joe_data)
# 如果我想把data中所有的负数都设置为0呢?
# data[data < 0] = 0
# print(data)
# 利用bool条件,还可以将筛选出的元素进行赋值
# 比如我想把'Bob'的数据都改成250
# data[names == 'Bob'] = 250
# print(data)
2. 神奇索引
# 2. 神奇索引
# '神奇索引'是Numpy中的术语,用于描述使用整数数组进行数据索引。
# 假设我们有一个 8 * 4 的数组,让它的第一列都为1,第二列都为2,以此类推。
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
# 我们可以指定一个序列,序列中的值是我想获取的索引(第几行),可选值为0~7
# index = [3, 2, 0, 7]
# filtered_arr = arr[index]
# print(filtered_arr)
# 当然,在我们python中还可以进行反向索引
# reverse_index = [-1, -3, -4]
# filtered_arr2 = arr[reverse_index]
# print(filtered_arr2)
# 如果我想根据指定位置来筛选数据呢?
# 当然可以,那么可以通过传递两个数组进行筛选。
selected_element = arr[[1, 3, 5, 7], [0, 3, 2, 1]]
# 第一个list的元素表示第几行,第二个list中的元素表示第几列
# 那么上述表示的就是:(1,0), (3,3), (5,2), (7,1)
print(selected_element)
3. 转置矩阵
# 3. 数组转置
arr = np.arange(1, 16).reshape(3, 5)
# print(arr)
# 可以使用array的属性 T 获取转置矩阵
# print(arr.T)
arr2 = np.arange(1, 9).reshape(2, 4)
# print(arr2)
# 还可以用来求 矩阵和其转置矩阵的内积
dot = np.dot(arr2, arr2.T)
print(dot)
4. 一元通用函数
所谓一元通用函数,就是函数接受一个参数(只有一个变量)。
PS: 有个别是二元通用函数,懒得摘出来了,自己挑吧...
# 4. 快速的逐元素数组函数(一元通用函数)
# 接下来看看numpy中常见的通用函数
arr = np.arange(1, 10)
# 4.1 np.sqrt() 开方
# sqrt_arr = np.sqrt(arr)
# print(sqrt_arr)
# 4.2 np.exp() e的次方运算
# exp_arr = np.exp(arr)
# print(exp_arr)
# 4.3 np.add() 加法运算,等同于 + 操作符
# added_arr = np.add(arr, arr)
# print(added_arr)
# 4.4 np.maximum(arr1, arr2) 逐个比较两个arr,返回较大的值组成的array
# arr2 = np.array([1, 5, 9])
# arr3 = np.array([3, 4, 10])
# arr4 = np.maximum(arr2, arr3)
# print(arr4)
# 4.5 np.minimum(arr1, arr2) 函数类似np.maximum,只不过取较小的值组成新的array
# 4.6 np.modf(arr) 返回两个arr,一个arr中是整数部分,另一个arr是小数部分
# Note:类似于python中math的modf()函数
# arr5 = np.random.randn(7) * 10
# integer_part, decimal_part = np.modf(arr5)
# print(integer_part)
# print(decimal_part)
# math.modf() 返回小数部分和整数部分的元组, (decimal, integer)
# import math
#
# integer_part1 = math.modf(12.34)
# print(integer_part1)
# 4.7 np.abs() np.fabs() 逐元素计算绝对值
# 二者的区别在于,abs()返回的arr.dtype 是int64,fabs()返回的arr.dtype 是 float64
# arr3 = np.array([-1, -3, 5, 7])
# abs_arr = np.abs(arr3)
# print(abs_arr, abs_arr.dtype)
#
# fabs_arr = np.fabs(arr3)
# print(fabs_arr, fabs_arr.dtype)
# 4.8 np.square(arr) 逐元素计算平方,等价于 arr ** 2
# arr3 = np.arange(5)
# square_arr = np.square(arr3)
# print(square_arr)
# 4.9 np.log() np.log10(), np.log2(), np.log1p()
# 4.10 np.sign() 计算每个元素的符号值,1(正数), 0(0), -1(负数)
# arr4 = np.array([-1, -5, 0, 2, 7])
# sign_arr = np.sign(arr4)
# print(sign_arr)
# 4.11 np.ceil() 计算每个元素的向上取整
# arr5 = np.array([-1.12, -3.78, 0, 1.56, 7.12])
# ceil_arr = np.ceil(arr5)
# print(ceil_arr)
# 4.12 np.floor() 计算每个元素的向下取整
# 4.13 np.rint() 将元素保留到整数位,并保持dtype不变
# arr5 = np.array([-1.12, -3.78, 0, 1.56, 7.12])
# rint_arr = np.rint(arr5)
# print(rint_arr)
# 4.14 np.isnan() 逐个元素判断是否是np.nan,返回一个bool类型的array
# arr6 = np.array([1, 2, 3, np.nan, np.nan])
# bool_arr = np.isnan(arr6)
# print(bool_arr)
# 怎么去掉array中的np.nan呢?可以利用之前学过的bool过滤
# arr7 = arr6[~bool_arr]
# print(arr7)
# 4.15 np.isfinite() np.isinf()
# isfinite() 逐个元素判断是否是有限(非inf, 非np.nan),返回bool array
# 4.16 np.cos() np.cosh() np.sin() np.sinh() np.tan() np.tanh() 这6个都是三角函数
# 4.17 np.arccos() np.arccosh() np.arcsin() np.arcsinh() np.arctan() np.arctanh() 反三角函数
# 4.18 np.logical_not() 逐元素按位取反,与 ~arr 效果一致
# arr8 = np.array([1,2,3,4])
# logical_not_arr = np.logical_not(arr8)
# print(arr8)
5. 二元通用函数
以此类推,这些函数需要接受两个参数呗。
# 5. 二元通用函数
# 5.1 np.add(arr1, arr2) 等效于 arr1 + arr2
# 5.2 np.subtract(arr1, arr2) 等效于 arr1 - arr2
# arr1 = np.array([1, 2, 3, 4])
# arr2 = np.array([2, 3, 4, 6])
# arr3 = np.subtract(arr1, arr2)
# print(arr3)
# 5.3 np.multiply(arr1, arr2) 等效于 arr1 * arr2
# 5.4 np.divede() np.floor_divide() 除法 和 整除
# 5.5 np.power(arr1, arr2) 将arr2中的元素作为arr1的幂次方
# arr1 = np.array([1, 2, 3])
# arr2 = np.array([2, 3, 4])
# power_arr = np.power(arr1, arr2)
# print(power_arr)
# 5.6 np.maximum(arr1, arr2) np.fmax(arr1, arr2)
# 逐个计算arr1和arr2对应位置的最大值,但是fmax()函数会忽略np.nan
# 5.7 np.minimum(arr1, arr2) np.fmin() 同上
# 5.8 np.mod()求模运算(除法求余数)
# arr4 = np.array([1, 3, 5, 7])
# mod_arr = np.mod(arr4, np.array([2, 2, 2, 2]))
# print(mod_arr)
# 5.9 np.copysign(arr1, arr2) 将arr1的符号改为arr2的
# arr5 = np.array([-1, 2, -3])
# arr6 = np.array([-1, -2, 3])
# copysign_arr = np.copysign(arr5, arr6)
# print(copysign_arr)
# 5.10 还有数学操作符
# 5.10.1 greater >
# 5.10.2 greater_equal >=
# 5.10.3 less <
# 5.10.4 less_equal <=
# 5.10.5 equal =
# 5.10.6 not_equal !=
# 5.11 还有逻辑操作符
# 5.11.1 logical_and &
# 5.11.1 logical_or |
# 5.11.1 logical_xor ^