创建数组 ndarray
所有元素为相同类型。
import numpy as np
# 接受一切序列型的对象
np.array()
# 数据类型
arr = np.array([1, 2, 3, 4, 5])
arr.dtype
arr1 = arr.astype(np.float64)
# 参数是一个表示数组形状的元组
np.zeros()
np.ones()
np.full((3, 4), 1) # full函数,创建任意大小的数组并填充任意数字
# 等差数列 一维
np.arange(5)
np.arange(3, 7) # 特定范围
# 多维
np.arange(6).reshape(2, 3)# 二维
# 单位矩阵
np.eye()
Numpy 中随机数的使用
# 随机数组
# 输入数组的大小,生成 [0, 1) 的数组
# 注意这里输入的形状不是以元组形式
np.random.rand(2, 3)
# 整数数组
np.random.randint(5, size = (2, 3)) # [0, 5)
np.random.randint(1, 5, size = (2, 3)) # [1, 5)
# Generate a 1 x 3 array with 3 different upper bounds
np.random.randint(1, [3, 5, 10])
np.random.randint([1, 5, 7], 10)
索引的使用
Numpy 中的数组索引与列表最重要的区别在于,直接赋值的数组切片是原始数组的视图,数据不会被复制,视图上的修改都会直接反映到原数组上。NumPy 在内部尽可能地共享内存,以提高性能。
a = np.array([[3, 8, 8],
[5, 7, 3],
[5, 6, 8]])
a[1, 2]
# 3
# 切片
# 冒号表示所取的范围,跟列表的索引用法一样,
# 逗号用来区分每个维度
a[-2:, 1:3]
# array([[7, 3],
# [6, 8]])
ls = np.array([1, 2, 3, 6, 8, 65, 43])
# 切片是视图
a = ls[2:5]
a # [3 6 8]
a[0] = 99
ls
# array([ 1, 2, 99, 6, 8, 65, 43])
# 使用 copy() 方法创建副本
a = ls.copy()
# 使用 copy 参数创建副本
a = np.array(ls, copy=True)
# array([ 1, 2, 12, 13, 34, 65, 43])
# 与 np.arange 活用
a[np.arange(3), 1] += 10 # 给a数组的第二列上的每个数加上10
a[[0, 1, 2], 1] += 10
布尔索引
布尔索引可以与切片、整数混合使用。要排除某值,可以使用 != 或者 ~ 符号对条件进行否定。
a[a > 10]
ans = a > 10
# array([[False, True, False],
# [False, True, False],
# [False, True, False]])
a[ans] # array([18, 17, 16])
a[~(a <= 10)]
花式索引
Fancy indexing 指利用整数数组进行索引。花式索引将数据复制到新数组中。
arr = np.arange(18).reshape(6, 3)
# array([[ 0, 1, 2],
# [ 3, 4, 5],
# [ 6, 7, 8],
# [ 9, 10, 11],
# [12, 13, 14],
# [15, 16, 17]])
arr[[4, 1]]
# array([[12, 13, 14],
# [ 3, 4, 5]])
arr[[4, 1], [1, 2]]
# array([13, 5])
arr[[4, 1]][:, [1, 2]]]
# array([[13, 14],
# [ 4, 5]])
数组的运算
求和与平均值的这类函数都有 axis 参数,指定进行计算的轴,返回的数组比原数组少一维。
cumsum
、cumprod
之类的函数返回与原数组同样大小的数组,每个低位的切片沿着指定轴计算部分聚类。
若数组为布尔数组,则强转为 1 和 0。
'''二维数组:
axis=0, -2 轴为行
axis=1, -1 轴为列
负数就是倒着求
'''
a = np.array([[1, 2], [3, 4]])
a.sum()
a.mean()
# 平铺
np.tile(a, (1, 2)) # 将数组a变成一行两列
# 排序
a.sort()
a.argsort() # 返回从小到大排序后的顺序
基本统计方法
方法 | 说明 |
---|---|
sum mean | 求和、求平均值 |
std var | 标准差、方差,自由度可调,默认为n |
min max | 最小值、最大值 |
argmin argmax | 最小值与最大值的索引 |
cumsum cumprod | 元素累计和、积 |
a = np.arange(9).reshape(3, 3)
# array([[0, 1, 2],
# [3, 4, 5],
# [6, 7, 8]])
a.cumsum()
# array([ 0, 1, 3, 6, 10, 15, 21, 28, 36])
a.cumsum(0)
# array([[ 0, 1, 2],
# [ 3, 5, 7],
# [ 9, 12, 15]])
a.cumprod(1)
# array([[ 0, 0, 0],
# [ 3, 12, 60],
# [ 6, 42, 336]])
# 数组中有没有True
b.any()
# 数组中有没有False
b.all()
# 唯一性
b.unique()
数组间的运算
# 相应位置上的运算
a + b
a - b
a * b
a / b
# 矩阵乘法
np.dot(A, B)
A.dot(B)
np.mat(A) * np.mat(B)
# 使用 np.mat 将二维数组准确定义为矩阵,就可以直接使用 * 完成矩阵乘法计算
# 转置
A.T
# 求逆
np.linalg.inv(A)
# 广播
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.array([1, 2, 3])
# 直接写为a + b, 当参与运算的操作数的维度不一样时numpy自动实现广播功能
a + b # 相当于 a + np.tile(b, (3, 1)) 在a的每一行都加上b
numpy.where
np.where
将三元表达式 x if condition else y
变成了矢量化版本。
x = np.random.randn(3, 3)
y = np.random.randn(3, 3)
# 创建一个布尔数组作为判断条件
z = np.random.randn(3, 3)
con = z > 0
# array([[False, False, True],
# [False, False, True],
# [False, False, True]])
# con为True则x,否则y
# 此处的x,y可以大小不等,也可以为标量
res = np.where(con, x, y)
本文内容为《利用Python进行数据分析(第二版)》Numpy 部分的笔记。