数据挖掘之路-Numpy基础

1. 什么是Numpy?

Numpy是 Numerical Python的简称,是目前python数值计算中最为重要的基础包。这些数值计算主要包括:

  1. 多维数组的运算,这使你不必再编写for循环来对数组中的值进行计算。
import numpy as np
a=np.array([1,2,3])
print((a**2))
[1 4 9]#如果使用列表,那将使用for循环挨个对列表中的元素进行操作
  1. 随机数的生成,相比于python内建库random,np.random可根据用户需求定义随机数生成,比如最常见的按正态分布生成随机数。
  2. 线性代数,矩阵的运算,行列式的计算,矩阵求逆等等。

2. Numpy ndarray

Numpy的核心特征之一就是N维数组对象-ndarry数组中的数据都是同类型的
这个数组允许你使用类似于标量的语法在整块数据上进行数学计算。(类似于上述代码块里的平方计算)

2.1 ndarray的基本属性

  1. 每一个数组都有一个shape属性,用来表示数组每一维度的数量。
import numpy as np
a=np.array([[1,2,3],[2,3,4]])
print(a.shape)
(2, 3)#2行3列
  1. 每一个数组都有一个dtype属性,用来表示数组的数据类型。
import numpy as np
a=np.array([[1,2,3],[2,3,4]])
print(a.dtype)
int32

2.2 ndarray的生成

可使用np.x()的以下函数方法生成数组。

函数名描述
array将输入数据(可以是列表、元组、数组以及其他序列)转换为ndarray
asarray将输入数据转换为ndarray,但如果输入已经是ndarray则不再复制(指向同一块内存,不再进行深拷贝)
arangepython内建函数range的数组版,返回一个数组
ones根据给定形状和数据类型生成全1数组
ones_like根据所给的数组形状生成一个一样的全1数组
zeros根据给定形状和数据类型生成全0数组
zeros_like根据所给的数组形状生成一个一样的全0数组
empty根据给定形状和数据类型生成初始值为空的数组
empty_like根据所给的数组形状生成一个一样的初始值为空的数组
full根据给定形状和数据类型生成内容为指定数值的的数组
full_like根据所给的数组形状生成一个一样的内容为指定数值的数组
eye,identity生成一个N*N的特征矩阵(主对角线位置全1,其余位置全0)

想使用np.empty生成一个全0数组并不安全,有时候它可能会返回未初始化的垃圾数值。
小tip:arrange方法只能给定一个参数,即生成0到几的一维数组,如果想生成高维数组需要用到reshape()方法。

import numpy as np
a=np.arange(10)
print(a)
print(a.reshape(2,5))
[0 1 2 3 4 5 6 7 8 9]#print(a)
[[0 1 2 3 4]
 [5 6 7 8 9]]#print(a.reshape(2,5))

2.3 ndarray的基础索引与切片

  1. 一维数组的索引和切片与python中的列表类似。不过如果你传递了一个数值给数组的切片,数值将会传递给原数组。区别于python的内建列表,数组的切片是原数组的视图,这意味着数据并不是像列表的子视图一样被复制了,任何对于原数组视图的修改都会反映到原数组上。
import numpy as np
l=["wuo","a"]
a=l[0:1]
a[0:1]="1"
print(l)
a=np.array(l)
a_slice=a[0:1]
a_slice[0]="1"
print(a)
['wuo', 'a']#对列表视图数据的修改并没有反映到原列表上
['1' 'a']#对数组视图数据的修改反映到了原数组上!

如果你还是想要一份数组切片的拷贝而非一份视图的话,你就必须显式地复制这个数据,如a[0:1].copy()

  1. 对于更高维度的数组,你会有更多选择。在一个二维数组中,每个索引值对应的便不再是一个值,而是一个一维数组。
    以下方式是等效的
a[0][2]==a[0,2]

虽然是等效的,但依然建议使用a[0,2]这种形式。
与python列表的一维对象类似,数组可以通过类似的语法进行切片,同时注意,对切片表达式赋值时,整个切片都会重新赋值

import numpy as np
a=np.eye(2,dtype=np.int32)
print(a)
print(a[1:,1])
a[1:]=233
print(a)
[[1 0]
 [0 1]]#print(a)
[1]#print(a[1:,1])
[[  1   0]
 [233 233]]#print(a)

2.4 ndarray的布尔索引

数组可以按布尔值自行判定输出。

import numpy as np
a=np.arange(5)
con=a>0
print(con,a,a[con])
[False  True  True  True  True] [0 1 2 3 4] [1 2 3 4]

python关键字and和or对布尔值数组并没有用,请使用 & 和 | 来代替。

2.5 ndarray的神奇索引

为了选出一个符合特定顺序的子集,可以手动指定顺序。(看例子就懂了)

import numpy as np
a=np.eye(5)
print(a[[1,0,2,3,4]])
[[0. 1. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

请注意,神奇索引与切片不同,它总是将数据复制到一个新的数组中。

2.6 数组转置和换轴

转置是一种特殊的数据重组方法,可以返回底层数据的视图而不需要复制任何内容。数组拥有 np.transpose() 方法,当然也有 .T 属性。

import numpy as np
a=np.eye(5)
b=a[[1,2,0,3,4]]
print(b)
print(b.T)
print(np.transpose(b))
[[0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]#print(b)
[[0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]#print(b.T)
[[0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]#print(np.transpose(b))

对于高维数组,transpose方法可以接收包含轴编号的元组,用于置换轴。

import numpy as np
a=np.arange(16)
a=a.reshape(2,2,4)
print(a)

print(a.transpose(1,0,2))
[[[ 0  1  2  3]
  [ 4  5  6  7]]

 [[ 8  9 10 11]
  [12 13 14 15]]]#print(a)
[[[ 0  1  2  3]
  [ 8  9 10 11]]

 [[ 4  5  6  7]
  [12 13 14 15]]]#print(a.transpose(1,0,2))

2.7 数组常用函数

以下方法都可以用np.x() 的方式实现。函数方法分为一元和二元
补充两个

函数名描述
abs、fabs逐个元素计算整数浮点数或复数的绝对值
sqrt计算每个元素的平方根(与arr**0.5相等)
square计算每个元素的平方(与arr**2相等)

常用的通用函数

2.8 数组中的条件逻辑

np.where()函数是三元表达式 x if condition else y 的向量化版本。常用情况如下(将一个数组中所有正值设为1,负值设为-1):

import numpy as np
a=np.random.randn(4,4)
print(a)
a=np.where(a>0,1,-1)
print(a)
[[ 0.04664653 -1.28451618  0.26419826  0.67257034]
 [ 0.02606113  0.85478368  1.06234863  0.7205168 ]
 [ 2.20376876 -1.07733641  0.18353773 -1.32409947]
 [ 0.69560828  1.66952173  0.18963199 -0.31033506]]
[[ 1 -1  1  1]
 [ 1  1  1  1]
 [ 1 -1  1 -1]
 [ 1  1  1 -1]]

2.9 数组中的数学统计方法

以arr.x()的形式使用,基础数组同济方法:

方法描述
sum计算所有元素的和
mean计算平均值
std,var标准差和方差
min,max最值
argmin,argmax最值的位置 (显示为第几个数,而不是其坐标)
cumsum累计和
sumprod累积积

2.10 布尔值数组的方法

布尔值数组有两个重要方法:

  1. arr.all() 检查是否arr中每个值都是True。
  2. arr.any() 检查arr中是否至少有一个值是True。

2.11 数组的唯一值和其他类似集合的逻辑

  1. np.unique() 返回数组中唯一值排序后形成的数组。
  2. np.in1d() 检查一个数组中的值是否在另一个数组中,并返回一个布尔型数组。
import numpy as np
a=np.random.randn(4,4)
a=np.where(a>0,1,-1)
print(a)
print(np.unique(a))
print(np.in1d(a,[0,1]))
[[ 1  1  1  1]
 [ 1 -1  1 -1]
 [-1  1  1  1]
 [-1  1 -1  1]]#print(a)
[-1  1]#print(np.unique(a))
[ True  True  True  True  True False  True False False  True  True  True
 False  True False  True]#print(np.in1d(a,[0,1]))

2.12 线性代数

numpy.linalg 拥有一个矩阵分解的标准函数集,以及其他常用函数,例如求逆、行列式等。
常用numpy.linalg函数

2.13 随机数生成

链接: numpy.random用法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值