数学建模社区-数学中国

标题: Python数据挖掘基础(二):Numpy [打印本页]

作者: 杨利霞    时间: 2020-5-8 17:53
标题: Python数据挖掘基础(二):Numpy

: J* t" Y% o- A  B5 |: _  T* J5 o; t! f6 \0 l( C  B  _
Python数据挖掘基础(二):Numpy目录! T  o2 n; Z! w6 H/ l

+ s) C& X5 g* s8 e' L- D( K: P1. Numpy的优势
$ B) ^4 Y4 x9 y/ s) e- n. T2. 数组属性
/ x  T( A* L5 H" \8 R3. 创建数组0 L4 ?& E  z  k& i4 `* z" ~
4. 数组形状与类型变化( ~6 e0 G4 Q8 B3 g' Q
4. 数组运算
5 E! ~# [3 P2 h9 P# f4.1 逻辑运算3 M& o  L3 I8 L
4.2 统计运算& ]' _4 s& v5 X. y) V4 T8 j; v3 \
4.3 数组间运算. k- V' |8 G3 k; e
4.4 合并分割
7 P! ^$ s4 g' V# ]) ^3 c; Y4 Q1. Numpy的优势
/ Y. K9 d6 b* P1 a- H
/ A. E0 z% C% i- P( R3 {Python已经提供了很多丰富的内置包,我们为什么还要学习NumPy呢?先看一个例子,找寻学习 NumPy 的必要性和重要性。如下:
# \6 E7 |; y1 @- t1 [: l( H
7 F5 s  q6 @7 m+ C) L' [完成同样的都对元素相加的操作,NumPy比Python快了11倍之多。这就是我们要学好NumPy的一个重要理由,它在处理更大数据量时,处理效率明显快于Python。并且内置的向量化运算和广播机制,使得使用NumPy更加简洁,会少写很多嵌套的for循环,因此代码的可读性大大增强。NumPy计算为什么这么快呢?原因如下:
# {( `  ?" c8 ?+ o- o  R/ o2 A9 U) D( H5 t8 Q# H9 F; R' N
Python 的 list是一个通用结构。它能包括任意类型的对象,并且是动态类型。+ i. u4 z& L$ B  k
NumPy 的 ndarray 是 静态、同质 的类型,当ndarray对象被创建时,元素的类型就确定。由于是静态类型,所以ndarray间的加、减、乘、除用 C 和 Fortran 实现才成为可能,所以运行起来就会更快。根据官方介绍,底层代码用 C语言 和 Fortran 语言实现,实现性能无限接近 C 的处理效率。8 Y+ @$ {. ?- B0 ~0 h
2.png
. T% Y! j) O4 w5 V" Y从图中我们看出来 NumPy 其实在存储数据的时候,数据与数据的地址都是连续的,这样就给我们操作带来了好处,处理速度快。
' n9 u! W! J, s7 r+ u* w7 k/ _5 L5 j支持并行化运算,也叫向量化运算。当然向量是数学当中的概念,我们不过多解释,只需要知道他的优势即可。也就是说 NumPy 底层使用 BLAS 做向量,矩阵运算。3 i1 ~4 n, ~. Q3 e, n- K/ z
numpy的许多函数不仅是用C实现了,还使用了BLAS(一般Windows下link到MKL的,下link到OpenBLAS)
% @" T' \) Y% r, s$ h. Q基本上那些BLAS实现在每种操作上都进行了高度优化7 S5 g  Q! `6 `/ T) C  a( h
例如使用AVX向量指令集,甚至能比你自己用C实现快上许多,更不要说和用Python实现的比3 Z( W! y0 a( S/ z9 ~+ o6 V4 {7 ~
11 e8 _0 d6 D1 V1 Z& R5 ?( N! Y( [
2
6 Y& n9 G- W0 M) N7 L& A* R* M! y3
( P" @* W2 A) f0 W由此可见,NumPy 就非常适合做大规模的数值计算和数据分析。4 w" m% q; d  V1 w( i
- M6 E: {6 a7 m3 W
2. 数组属性2 l& |9 C/ O% \; W9 z3 k  ?

: U. x" U2 i9 ~& a" G8 i. i数组属性反映了数组本身固有的信息。8 _* N( \% r$ `% T' C0 L

% a+ `  s! H# h8 l; l2 w0 d; S" s属性名字        属性解释
3 w; m, k! T' D2 K& o3 ~( \3 vndarray.shape        数组维度的元组
" y5 `: m% v( S* W9 z4 @ndarray.flags        有关阵列内存布局的信息, F0 P: x' p* D# K/ e" a+ [. h& c; f
ndarray.ndim        数组维数
7 e9 [8 X3 ?. a; undarray.size        数组中的元素数量7 j% m. _+ G3 Q8 c2 D: M
ndarray.itemsize        一个数组元素的长度(字节)3 ~+ H$ G% Q( X; d5 }
ndarray.nbytes        数组元素消耗的总字节数  H9 K5 t6 ]4 v# V; q0 y+ q
示例代码如下:
- n, U6 {) E3 C5 @( L9 A+ kimport numpy as np
: n1 n1 R4 j; i3 e  w1 ^
9 a7 d& y% g( a% K. Q+ a# 数组的属性; d7 J1 h1 M$ p, j
# 1.创建数组 这里先不用管 后续会详细讲解数组的创建方法  L& t/ D( k& W8 t# ^! m4 g
a = np.array([[1,2,3],[4,5,6]])
% \1 ~- \) {  nb = np.array([1,2,3,4])
, r/ {. {. ^$ N5 T! a5 l" `+ Oc = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])) Z5 P! K" d% O7 Q
# 创建数组的时候指定类型
  L' V2 h6 U4 z# V; C% d& U( E# dtype更多取值: int complex bool object! R0 l# E! T, x
# 还可以显示的定义数据位数的类型,如: int64、int16、float128、complex128。
0 P% w) F% @8 p8 o' l# N4 Hd = np.array([1,2,3,4], dtype=np.float)
9 ^6 F- C1 R+ y2 Z( |7 f( x  M
" f, t! j, j9 L( a' G8 A# 2.测试数组属性
3 `9 o( {7 M4 a. Hprint(a.shape)  # 数组形状  (2, 3): 二维数组0 x9 ?0 P* U& Y
print(b.shape)  # (4,) 一维数组: 有4个元素/ y' L3 `  D( |, ]- |
print(c.shape)  # (2, 2, 3): 三维数组
: I$ B: c1 C6 T/ L- Wprint(a.ndim)  # 数组维数 2
, g/ Z& S# ~4 Q8 l6 U( aprint(a.size)  # 元素的数量 6 7 x& ~3 e% |& X5 m0 \
print(a.itemsize)  # 每一个元素占的位数(字节) 8
" t- y9 z) l6 q  R1 M. nprint(a.nbytes)  # 总共占的字节数 6*8 ==> 48- a5 }1 X5 W2 r5 c- g& @
print(a.flags)  # 阵列内存布局0 h# o- Y) E9 |- \
print(a.dtype)  # 数组类型 int64
+ O$ f9 \( Q2 v$ y; P8 Y' k. z' Fprint(d.dtype)  # float64! L, q, b; a7 L( r. y! H
; H$ M0 u' `$ S* q" v8 j
& ~7 @7 K" ?! O4 e
import numpy as np& x' }5 C4 ~9 C/ {) i

- F4 a: L5 t- P2 q3 z+ [上述代码执行结果如下:1 U4 z' E. x7 E) S* F: t$ ?& n  K
3.png : n' f8 p4 n- y" \' d9 E7 I
5 a9 w! y9 C9 }
3. 创建数组1 q% u* o# q+ S5 @% }. ]* \1 H; C

) E5 g3 @. T! e7 w: j: ]1. 创建0和1的数组 示例代码如下:
/ b6 Z- X" p  K1 A# }1 g 4.png
% M& k5 H" K8 W# R: C6 s: z1 F0 ]2. 从现有的数据中创建 示例代码如下:: s& @$ E5 b9 [* Z& t1 e, a- G
8 m, {( n! J+ _1 |3 G
num_list = [[1,2,3], [4,5,6]]3 ~; f7 `5 X# e! q
a = np.array(num_list)
9 t2 ~5 W! z" S# s% aa1 = np.array(a)  # 创建了一个新的数组$ }1 ]" K- Y, l8 u
a2 = np.asarray(a)  # 还是引用原来的数组# Y5 d5 {2 @* F9 T: K& w
print(a)6 J- K' K5 K/ Z2 S. [, T" S$ |
print(a1)
( J, x" u$ R% y5 x+ Jprint(a2)0 J! ]9 C7 g: E6 l7 v
a[0] = 107 [0 r2 P* x( \9 i& y
a, a1, a24 {1 a9 k# z3 M4 b" M5 W

7 }8 r' y# C7 `/ U上述代码执行结果如下:
. U4 ~) ?& K7 w+ F- b& [+ N5 E/ x6 E 5.png
' p" a2 Z; i) u' E1 R' y5 h6 M+ Z3. 创建固定范围的数组,语法格式如下:
! `# Y% P# _( ~/ Y  `/ v
" ^, O# a2 q" F. V9 W4 L+ Inp.linspace(start, stop, num, endpoint, retstep, dtype) 生成等间隔的序列
9 U) N/ j- W9 Z( C5 v& }( |start:序列的起始值
" \, }0 d$ ^  A" h8 d& P( Istop:序列的终止值6 ~9 X: L( d7 l# K3 J" K! i  V0 v
num:要生成的等间隔样例数量,默认为50
3 O; R' F, R* }! `6 z& U# y0 zendpoint:序列中是否包含stop值,默认为True/ k6 f# ]+ K3 W8 j( Q
retstep:如果为True,返回样例,以及连续数字之间的步长
& @3 M3 S8 Y& Y3 c" Gdtype:输出ndarray的数据类型
: g; g+ Y  Q" z! a3 ]11 j  T& n, O1 B# e8 O4 f$ w
2& y7 @( W# n+ s3 f2 }( k0 M
38 h: N5 u! ^/ F0 P3 t
4
  v- P6 M$ w# r" p4 a5
  n+ p) N9 H+ S3 A, i) W- |65 I  i1 y7 @( ?( z5 o
7/ j; H* F  s/ @2 |, o' D, U' V8 f
示例代码如下:
" |& e& ^& z) W. Y; g( A
7 C& J/ ?0 F- \7 {, b3 narr = np.linspace(0, 10, 10)) F7 J' S! h) l2 P
arr. L) Q' e" V: Q) _8 g8 b
1
) r+ X$ x  K3 Z5 O& O2& ?' o1 b5 b+ M5 e, r5 r
执行结果如图所示:
3 X2 t. p4 x0 ^' {0 T2 A  M* B
- z7 S6 Z7 Y$ E! h( Z" O) I其它的还有:/ C; Z* k8 i8 N0 c' b. }- s2 W
( n: X' r' n! q' S* \5 l3 `
numpy.arange(start,stop, step, dtype) 示例代码如下:- F. a# P& d& r% l" P7 ~
np.arange(1, 10, 2), E* S4 `5 O8 Z  {2 O9 \
1
' l7 h9 i7 \* y4 z5 W3 T运行结果如图所示:
: i; W" Z9 P, {9 {/ D 6.png 4 u" t+ }3 z- X! t
numpy.logspace(start,stop, num, endpoint, base, dtype) 构造一个从10的-2次方 到 10的2次方 的等比数列,这个等比数列的长度是 10 个元素,示例代码如下:. }" R1 C% {8 A6 _! e# T" o
np.logspace(-2,2,10)$ s& \6 @: P6 K, e5 H
1
! g% D9 x7 h  [运行结果如图所示:  \' V: c9 ?% F5 W" F4 n+ k
7.png ' p  J& m# E7 E+ l* V
如果不想是10的次方,也就是想改变基数,那么可以这么写,代码如下:
+ @# E. |2 E7 T: A. rnp.logspace(-2,2,10,base=2): k2 [* M) E* c- ]. X
1$ C; H! Y( t# h' V& T
运行结果如图所示:$ S6 L9 C3 R; Q# I! L5 @
8.png , E4 Z4 V6 {& m- ~* ^
4. 创建随机数组
* \  Y2 v0 |. g4 ~* v2 R# x. |) v3 ~4 p3 S/ J' s, E& B. y/ F6 G0 L
np.random 模块生成随机数组,更加方便,示例代码如下:
: ]% }9 E# y0 S; a: ^
2 V" H. s3 v! M3 r, o3 H上面产生的数据是属于一个均匀分布。那么什么是均匀分布呢?在概率论和统计学中,均匀分布也叫矩形分布,它是对称概率分布,在相同长度间隔的分布概率是等可能的。 均匀分布由两个参数a和b定义,它们是数轴上的最小值和最大值,通常缩写为U(a,b)。9 M" m3 p9 G- Q: ?% D) \& a
* J' _6 S0 i5 e) _. }3 M- B
正态分布?给定均值/标准差/维度的正态分布,示例代码如下:
0 U9 p! W9 A8 d; q$ h/ i
& N. I5 m; H2 B6 _正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(μ,σ )。
4 m+ p5 E; o' @  W/ S7 a
  M' d% p% x, e) ~( ^5 _, o# G( y0 \生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。μ决定了其位置,其标准差σ。决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。7 Y' v. Q. h1 n4 N$ J! g
2 x9 {. N+ v' G
标准差如何来?方差是在概率论和统计方差衡量一组数据时离散程度的度量。
3 z, @. s* [7 u8 D/ P4 ~, `# J
+ k# |3 e/ j+ K- o3 l其中M为平均值,n为数据总个数,s为标准差,s^2可以理解一个整体为方差。8 z1 e. B8 P, G3 N% Q3 p

. x) f) p5 t& h9 w$ S& Q通过索引切片等获取数组中的值,一维数组示例代码如下:
* |3 v( G% |# d5 {, i4 m8 ], D0 M5 }, d, V, W4 V. h3 f
二维数组示例代码如下:2 T; @% q/ K1 U1 R7 n

& `( X5 K" Q' }, Y; M三维数组示例代码如下:
; c# @* |7 }6 H# w* b
% i7 y4 i. Y; V  t
" @+ ^; z7 |# [$ c4. 数组形状与类型变化6 j# f! \0 f, {9 l* a# i" b
* \8 b) }! h% O# ?' J
1. ndarray.reshape(shape[, order]) Returns an array containing the same data with a new shape. 示例代码如下:4 B! K" K: I# L5 g
- Z4 m' Z# V2 `& R+ R( f/ ]
2. ndarray.resize(new_shape[, refcheck]) Change shape and size of array in-place. 示例代码如下:/ o2 f  |/ _7 O( t$ \
- l5 A' i- ?2 g1 L" ~
3. 修改类型 ndarray.astype(type) 示例代码如下:! [% R( C! ]! t+ G
6 R' {8 M& z3 F2 ]9 }' `. I
4. 修改小数位数 ndarray.round(arr, out) Return a with each element rounded to the given number of decimals. 示例代码如下:
7 y. R0 K9 ?* B3 h: Q2 F0 d3 O6 T5 G6 z* p8 i/ t
5. ndarray.flatten([order]) Return a copy of the array collapsed into one dimension. 示例代码如下:1 e5 ^+ [) j( B

, N1 k6 C" B, c6. ndarray.T 数组的转置 将数组的行、列进行互换 示例代码如下:! D% F6 K( @/ P1 S3 }

) |" ]" q3 w& F. ~" X7. ndarray.tostring([order])或者ndarray.tobytes([order]) Construct Python bytes containing the raw data bytes in the array. 转换成bytes" l/ B- w1 U' J0 p
2 l/ \6 q' c+ a& `) I
8. ndarray.copy([order]) Return a copy of the array. 当我们不想修改某个数据的时候,就可以去进行拷贝操作。在拷贝的数据上进行操作,示例代码如下:
+ ~  Q+ u% j2 }  e) t7 @2 L1 D. w8 v' R# S# k% Y4 r
9 h8 D0 u. E8 [
4. 数组运算% k8 m- r9 _! w" v4 C+ x3 a

' U! S) u; G) r4 e( p3 c4.1 逻辑运算
, I/ ~% E: `/ s. a# _4 U8 C0 C" }$ m7 H  X1 P
/ G( X! {% i4 C
通用判断函数,np.all(),示例代码如下:# b* J+ [* @5 l* m+ Z: y
' a( x( s% Z5 S$ U4 H. h, `
np.unique():返回新的数组的数值,不存在重复的值,示例代码如下:' K  T+ \% H' E" a

0 k  }6 o6 f5 f2 d! |! {3 Mnp.where (三元运算符):通过使用np.where能够进行更加复杂的运算,示例代码如下:
) G; k7 [7 o, Y4 c! W8 c$ S  Z; ~  y, w* T1 Z4 \0 O! T! {

6 p* U+ e4 Y6 E$ ~4.2 统计运算
* R" p  H' K* v/ u! c6 v
- n  u. a% D$ ^5 M在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。注意:进行统计的时候,axis轴 的取值并不一定, NumPy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行 去进行统计。常用的指标如下:
) N8 a6 S' ^$ |( q  n/ n
' d6 y$ |; o$ u) \min(a[, axis, out, keepdims]) Return the minimum of an array or minimum along an axis. 示例代码如下:
6 t% @2 q& N2 b2 \; u
3 y$ k* ~5 g0 b( {max(a[, axis, out, keepdims]) Return the maximum of an array or maximum along an axis. 示例代码如下:
, ^& i) Q) e; D6 ~
; ?+ L' A9 M) Q6 k7 b* ^3 ?: F4 xmedian(a[, axis, out, overwrite_input, keepdims]) Compute the median along the specified axis. 示例代码如下:
- _. n0 H& x7 k; V, v8 E6 A  T* j4 q' s3 n9 R% `2 s3 ?
mean(a[, axis, dtype, out, keepdims]) Compute the arithmetic mean along the specified axis. 示例代码如下:6 B5 Q) x5 w- X$ U: v/ l/ F7 t# Q
% K3 y( T) S" r  k  J- l  k
std(a[, axis, dtype, out, ddof, keepdims]) Compute the standard deviation along the specified axis. 示例代码如下:
" u+ [! q! t6 w, t# f/ N! t/ D! ]+ j
var(a[, axis, dtype, out, ddof, keepdims]) Compute the variance along the specified axis. 示例代码如下:
; O/ {; ?3 F# M% i4 U7 E. P# }( ]0 W) q
np.argmax(temp, axis=) 示例代码如下:
+ @; u* m& z5 l" _2 Q) X0 ]: g1 |$ l: a- f) }. a+ e3 O
np.argmin(temp, axis=) 示例代码如下:5 E( V! D, j; P; b+ f; _' F3 O
& Y% r( E3 m2 K' I9 h
4.3 数组间运算. N4 M" k- G2 T  u8 T9 v. h

; }* ~+ `; P% m数组与数的运算,示例代码如下:" _6 x3 z" ?& g* x5 v
3 L$ Z+ M7 j2 F7 }+ G3 c; B$ T0 w' L
矩阵运算,什么是矩阵?矩阵,英文matrix,和array的区别矩阵必须是2维的,但是array可以是多维的。示例代码如下:+ L. e  x' C2 f/ V% u

# v, B; ]$ t, x9 q7 J* d9 w# b5 d! h  [! q
4.4 合并分割# l0 D1 i1 [3 Q4 l
5 ]7 r% A5 q# b$ Y0 R, y
numpy.concatenate((a1, a2, …), axis=0) 示例代码如下:) A+ Q3 F8 y- Y/ E0 |

8 V! e0 J, Z% @3 Q0 z* Gnumpy.hstack(tup) Stack arrays in sequence horizontally (column wise). 示例代码如下:" q2 \5 [5 }' N! W* e6 c1 q
2 b! K9 y& I7 S4 @+ i6 J# j
numpy.vstack(tup) Stack arrays in sequence vertically (row wise). 示例代码如下:$ T  h% [- M. L0 Z2 C

+ N% n8 b6 {" ]" `: Xnumpy.split(ary, indices_or_sections, axis=0) Split an array into multiple sub-arrays. 示例代码如下:
* Z+ t- Z6 G! [
) y9 `9 r7 F: a/ L+ k/ Z3 ]————————————————
) h, ]# n; t8 q3 i) h6 X( v6 @版权声明:本文为CSDN博主「Amo Xiang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 O; G4 |4 }! N6 N+ m
原文链接:https://blog.csdn.net/xw1680/article/details/105931313
( X2 x& |* \: }) Z8 H
1 o' m6 B9 l% j0 ]* c! e, T9 R& A2 F$ _- C' T, }

1.png (142.46 KB, 下载次数: 443)

1.png

2.png (164.52 KB, 下载次数: 420)

2.png


作者: 建模小白12138    时间: 2020-5-9 14:30
谢楼主!!!!!!!!!!!!: G& E* g7 a2 }4 t  ]7 E3 m





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5