numpy学习笔记 全面|目录|书籍精华

文章目录

  • 多维数组对象
    • 生成数组
    • 数组的运算
    • 基础索引和切片
    • 布尔索引
    • 神奇索引
  • 使用数组进行面向数组编程
    • meshgrid理解
    • 条件逻辑
    • 数学统计方法
    • 布尔值数组的方法
    • 排序
    • 数组的集合操作
  • 生成随机数

建议阅读相关书籍进行系统学习,此篇文章仅做个人总结之用。

  1. 《利用Python进行数据分析》——韦斯·麦金尼
  2. 莫凡的教程

多维数组对象

生成数组

  1. 生成数组:np.array(),dtype 默认为float64
    转换数据类型:arr = np.array, arr.astype(np.int32),这一部操作是将float64转化为int32,且这个函数默认生成新数组
  2. 生成零数组:np.zeros()
  3. 生成空数组:np.empty()
  4. range 函数的数组版本:np.arange(15).reshape(3,5)
  5. 生成一个线段:a = np.linspace(1,10,20).reshape(3,4),生成一个20段1-10的数列(拆成20个数字)
  6. 生成2行4列的属于(0,1)随机数组:np.random.random((2,4))

数组的运算

数组之间每个元素的运算,这里的每个数组尺寸应该相同,不同数组涉及到广播的知识,这里暂不做解释。

  1. 最大值/最小值/求和np.sum(a, axis=1),np.min(a),np.max(a)
    axis=1代表列,axis=0代表行
  2. 逐个比较两个数组的大小
x = np.random.randn(8)
y = np.random.randn(8)
print(np.maximum(x, y))
  1. 计算小数部分和整数部分
remainder,whole_part = np.modf(arr)
  1. 乘法:python的平方是用**表示
    如果用矩阵的运算应该是np.dot(a,b)或者a.dot(b),就不会是各个元素之间的乘法了。
    具体的函数见书P207页

基础索引和切片

与列表相似,前闭后开,
与Python中列表的不同

  1. 传入数值给切片,python是不允许的,numpy是允许的
arr = np.arange(10)
arr[5:9] = 12
print(arr)
##################################
a = range(10)
a[5:9] = 12
print(a)

上面的运算结果:

[ 0  1  2  3  4 12 12 12 12  9]

下面的运算结果

TypeError: 'range' object does not support item assignment

list 是不能全部赋值的

2.浅拷贝和深拷贝: python中赋值是直接产生一个新的对象,但是numpy赋值不是,只是一个原数列的视图。改变复制过的,原数组也会被改变
例子:

a = list(range(10))
c = a[5:8]
c[1] = 12
print(a)

b = np.arange(10)
d = b[5:8]
d[1] = 12
print(b)

运行结果

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[ 0  1  2  3  4  5 12  7  8  9]

那如果想要实现拷贝应该怎样呢?arr[5:8].copy()

  1. numpy支持多组索引
a = np.arange(1, 10).reshape(3, 3)
# 取a的前二行(前闭后开),后两列(前闭后开)
print(a)
print(a[:2, 1:])

运行结果

[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[2 3]
 [5 6]]

布尔索引

a = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
print(data)
print(a == 'Bob')
print(data[a == 'Bob', :2])
# 下面两种方法是一样的
print(data[a != 'Bob', :2])
print(data[~(a == 'Bob'), :2])

运行结果

[[ 1.20241647  0.36663084  1.85073518  0.67903502]
 [ 0.29870251 -1.0132424   0.11510327 -0.14303322]
 [-1.40256722  1.75919835 -0.22010801  0.80810424]
 [-0.71759139  2.44953776 -0.87907408  0.74139462]
 [-1.26135595 -1.0156839   0.51825134  0.46750828]
 [ 2.07459465 -1.66901302  0.48055465  0.37875228]
 [-1.06639616 -0.21239745 -0.02350804  1.07777372]]
[ True False False  True False False False]
[[ 1.20241647  0.36663084]
 [-0.71759139  2.44953776]]
[[ 0.29870251 -1.0132424 ]
 [-1.40256722  1.75919835]
 [-1.26135595 -1.0156839 ]
 [ 2.07459465 -1.66901302]
 [-1.06639616 -0.21239745]]
[[ 0.29870251 -1.0132424 ]
 [-1.40256722  1.75919835]
 [-1.26135595 -1.0156839 ]
 [ 2.07459465 -1.66901302]
 [-1.06639616 -0.21239745]]

神奇索引

生成一个新的对象,跟切片不同,生成的不是一个视图对象。

arr = np.arange(32).reshape((8, 4))
# 取出(1,0),(5,3),(7,1),(2,2)的元素
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]])
# 取出1,5,7,2行元素,再把列进行排列
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]])

运行结果

[ 4 23 29 10]
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]

使用数组进行面向数组编程

meshgrid理解

m, n = (5, 3)
x = np.linspace(0, 1, m)
y = np.linspace(0, 1, n)
X, Y = np.meshgrid(x,y)
x
out:
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ])
y
out:
array([ 0. ,  0.5,  1. ])
X
out:
array([[ 0.  ,  0.25,  0.5 ,  0.75,  1.  ],
       [ 0.  ,  0.25,  0.5 ,  0.75,  1.  ],
       [ 0.  ,  0.25,  0.5 ,  0.75,  1.  ]])
Y
out:
array([[ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0.5,  0.5,  0.5,  0.5,  0.5],
       [ 1. ,  1. ,  1. ,  1. ,  1. ]])

X就是横着摆,复制y的维度那么多倍
y就是竖着摆,复制x的维度那么多倍

条件逻辑

条件1:np.where(a,b,c)
a : 里面是参数,对应的元素是True
b:里面是True对应应该选择的数,c里面是False选择的数

数学统计方法

np.mean(arr),np.sum(arr),可选参数axis

cumsum理解
例子:

a = np.array([[1, 2, 3], [4, 5, 6]])
print(np.cumsum(a))
print(np.cumsum(a, axis=0))
print(np.cumsum(a, axis=1))
###################运行结果##################
[ 1  3  6 10 15 21]
#array([1,1+2=3,1+2+3=6,1+2+3+4=10,1+2+3+4+5=15,1+2+3+4+5+6=21])
[[1 2 3]
 [5 7 9]]
 #[1,    2,    3]
 #[1+4=5,2+5=7,3+6=9]
[[ 1  3  6]
 [ 4  9 15]]

布尔值数组的方法

计算正值的个数

arr = np.random.randn(100)
print((arr > 0).sum())

排序

排序是新产生一个对象,函数本身不
arr.sort(1):每一行按照从小到大进行排序
arr.sort():每一列按照从小到大进行排序

数组的集合操作

方法 描述
unique(x) 计算x的唯一值,并排序
intersect1d(x,y) 计算x和y的交集,并排序
union1d(x,y) 计算x和y的并集,并排序
in1d(x,y) 计算x中的元素是否包含在y中,返回一个布尔数值
setdiff1d(x,y) 差集,在x中但不在y中的x的元素
setxor1d(x,y) 异或集,在x或者y中,但不属于x,y交集的元素

数组的合并操作
np.vstack((A,B)):纵向合并
np.hstack((A,B)):横向合并
数组的array分割
np.split(A,3,axis=0):将A分成3行
np.split(A,4,axis=1):将A分成四列
进行不等项分割:np.array_split()
矩阵运算用linalg运算:书籍228页

生成随机数

  1. 生成4*4的正态分布样本:np.random.normal(size=(4,4))
    这里的括号中间为什么要写size,跟np.random.random((2,4))区分一下,如果不写,那么生成的就是均值为4方差为4的一个值。
  2. random模块
    官方random文档
    书籍4.7节也有讲到

你可能感兴趣的:(机器学习)