Python_数据分析_numpy模块

numpy可以说是Python运用于人工智能和科学计算的一个重要基础,关于库的引入不做赘述,主要分享一些总结的numpy库的用法。

1. numpy数组对象

Numpy中的多维数组称为ndarray,这是Numpy中最常见的数组对象。ndarray对象通常包含两个部分:

  • ndarray数据本身
  • 描述数据的元数据

Numpy数组的优势

  • Numpy数组通常是由相同种类的元素组成的,即数组中的数据项的类型一致。这样有一个好处,由于知道数组元素的类型相同,所以能快速确定存储数据所需空间的大小。
  • Numpy数组能够运用向量化运算来处理整个数组,速度较快;而Python的列表则通常需要借助循环语句遍历列表,运行效率相对来说要差。
  • Numpy使用了优化过的C API,运算速度较快

2 numpy数组(ndarray)的创建

2.1 array()

通过array方式创建,向array中传入一个list实现

import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

print(array1)
print(array2)

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

2.2 arange()

通过arange创建数组:下例中创建一个0~1间隔为0.1的行向量,从0开始,不包括1,第二个例子通过对齐广播方式生成一个多维的数组。

import numpy as np

array1 = np.arange(0, 1, 0.1)
array2 = np.arange(1, 70, 10).reshape(-1, 1) + np.arange(0, 7)
array3 = np.arange(24).reshape(2,3,4)

print(array1)
print(array2)
print(arrat3)

[Running]=======
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

[[ 1  2  3  4  5  6  7]
 [11 12 13 14 15 16 17]
 [21 22 23 24 25 26 27]
 [31 32 33 34 35 36 37]
 [41 42 43 44 45 46 47]
 [51 52 53 54 55 56 57]
 [61 62 63 64 65 66 67]]
 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

2.3 linspace()&logspace()

通过linspace函数创建数组:下例中创建一个0~1间隔为1/9的行向量(按等差数列形式生成),从0开始,包括1.
通过logspace函数创建数组:下例中创建一个1~100,有20个元素的行向量(按等比数列形式生成),其中0表示100=1,2表示102=100,从1开始,包括100

import numpy as np

array1 = np.linspace(0, 1, 10)
array2 = np.logspace(0, 2, 20)

print(array1)
print(array2)

[Running]===========
[0.         0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
 0.66666667 0.77777778 0.88888889 1.        ]
[  1.           1.27427499   1.62377674   2.06913808   2.6366509
   3.35981829   4.2813324    5.45559478   6.95192796   8.8586679
  11.28837892  14.38449888  18.32980711  23.35721469  29.76351442
  37.92690191  48.32930239  61.58482111  78.47599704 100.        ]

2.4 生成特殊数列

  • ones、ones_like,根据形状创建一个全1的数组、后者可以复制其他数组的形状
  • zeros、zeros_like,类似上面,全0
  • empty、empty_like,创建新数组、只分配空间
  • eye、identity,创建对角线为1的对角矩阵
    注意要指定数组的规模(用一个元组指定),同时要指定元素的类型,否则会报错。这部分函数较简单,不进行测试

2.5 生成随机数组

简单使用随机数生成数组和arange()方法生成类似,更多生成方法可以更详细的查找阅读。

import numpy as np
from numpy.random import randn

arr = randn(12).reshape(3, 4)
print(arr)

[Running]========
 [[ 0.98655235  1.20830283 -0.72135183  0.40292924]
  [-0.05059849 -0.02714873 -0.62775486  0.83222997]
  [-0.84826071 -0.29484606 -0.76984902  0.09025059]]
 

3. dtype

Numpy的全部数据类型如下:
在这里插入图片描述
每一种数据类型都有相应的数据转换函数,创建数组是可以用dtype进行说明

import numpy as np

array1 = np.ones((2, 3), dtype = 'float')
array2 = np.array([1. ,2. ,3. ], dtype = 'int32')

print(array1)
print(array2)

[Running] =========
[[1. 1. 1.]
 [1. 1. 1.]]
 
[1 2 3]

4. ndarray()属性

4.1 dtype属性

ndarray数组的数据类型,数据类型的种类,前面已描述。
需要注意的是,复数的虚部符号为j,且不能转化为float数据类型

4.2 ndim属性

ndim用来描述数组的维度,需要注意的是这个属性比较实用二维数组,当数组维度是三维时,只能返回倒数第二个维度。

import numpy as np

array1 = np.ones(24).reshape(2,3,4)
array2 = np.ones(8).reshape(2,4)

print(array1.ndim)
print(array2.ndim)

【Running】========
3
2

4.3 shape属性

数组对象的尺度,对于矩阵,即n行m列,shape是一个元组(tuple),相比于ndim属性,反映的更全面。

import numpy as np

array1 = np.ones(24).reshape(2,3,4)
array2 = np.ones(8).reshape(2,4)

print(array1.shape)
print(array2.shape)

【Running】=========
(2, 3, 4)
(2, 4)

4.4 size属性

size属性是数组中保存元素的数量

import numpy as np

array1 = np.ones(24).reshape(2,3,4)
array2 = np.ones(8).reshape(2,4)

print(array1.size)
print(array2.size)

【Running】=======
24
8

4.5 itemsize属性

itemsize属性返回数组中各个元素所占用的字节数大小。

import numpy as np

array1 = np.ones(24).reshape(2,3,4)
array2 = np.ones(8).reshape(2,4)

print(array1.itemsize)
print(array2.itemsize)

【Running】==========
8
8

4.6 nbytes属性

如果想知道整个数组所需的字节数量,可以使用nbytes属性。其值等于数组的size属性值乘以itemsize属性值。

import numpy as np

array1 = np.ones(24).reshape(2,3,4)
array2 = np.ones(8).reshape(2,4)

print(array1.nbytes)
print(array2.nbytes)

【Running】===========
192
64

4.7 T属性

import numpy as np

array1 = np.arange(24).reshape(4,6)

print(array1)
print(array1.T)

【Running】=======
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]

4.8 real&imag属性

real和imag分别返回数组的实部和虚部,这里不进行举例说明。

4.9 flat属性

flat属性,返回一个numpy.flatiter对象,即可迭代的对象。

import numpy as np

array1 = np.arange(6).reshape(2,3)
f = array1.flat

print(array1)
for i in f:
	print(i)

【Running】==========
[[0 1 2]
 [3 4 5]]
0
1
2
3
4
5

flat属性生成迭代器后,能够进行一些赋值和索引操作

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])
array1.flat = 7
print(array1)
【Running】=======
[[7 7 7 7]
 [7 7 7 7]
 [7 7 7 7]]
import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])
f = array1.flat
print(f[[1,4]])
【Running】==========
[12 21]

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])
f = array1.flat
f[[1,5]] = 7
print(array1)
【Running】=======
[[11  7 13 14]
 [21  7 23 24]
 [31 32 33 34]]


5. adarray切片与索引

adarray的索引和列表相似,有几个维度就可用几个维度来引用

import numpy as np

array1 = np.array([1, 2, 3, 4])

array2 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])

print(array1[2])     # 一维数组索引
print(array2[0][0])  # 二维数组索引
print(array2[0])     # 二维数组索引行
print(array2.T[0])   # 二维数组索引列

【Running】===========
3
11
[11 12 13 14]
[11 21 31]

6. shape变化

6.1 形状变换

6.1.1 shape & resize

shape 和 resize都能改变数组的维度,resize是将原本的数组改变,shape是改变单次视图

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])

print(array1.reshape(2,6))
array1.resize(4,3)
print(array1)

【Running】============
[[11 12 13 14 21 22]
 [23 24 31 32 33 34]]
[[11 12 13]
 [14 21 22]
 [23 24 31]
 [32 33 34]]
6.1.2 ravel() & flatten()

ravel() 和 flatten(),都是讲多维数组转为一维数组。两者的区别在于返回拷贝(copy)还是返回视图(view),flatten()返回一份拷贝,需要分配新的内存空间,对拷贝所做的修改不会影响原始矩阵,而ravel()返回的是视图(view),会影响原始矩阵。

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])

print(array1.flatten())
array1.flatten()[0] = 0
print(array1)

print(array1.ravel())
array1.ravel()[0] = 0
print(array1)

【Running】===========
[11 12 13 14 21 22 23 24 31 32 33 34]
[[11 12 13 14]
 [21 22 23 24]
 [31 32 33 34]]
[11 12 13 14 21 22 23 24 31 32 33 34]
[[ 0 12 13 14]
 [21 22 23 24]
 [31 32 33 34]]
6.1.3 转置

前面描述了数组转置的属性(T),也可以通过transpose()函数来实现

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])

print(array1.transpose())

【Running】============
[[11 21 31]
 [12 22 32]
 [13 23 33]
 [14 24 34]]

6.2 堆叠数组

6.2.1 hstack() & column_stack()

hstack()是水平堆叠,即将两个数组水平连接,进行水平堆叠时要注意有相同的行

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])
array2 = array1 * 2
print(np.hstack((array1,array2)))

【Running】=================
[[11 12 13 14 22 24 26 28]
 [21 22 23 24 42 44 46 48]
 [31 32 33 34 62 64 66 68]]
6.2.2 vstack() & row_stack()

vstack()是垂直叠加

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])
array2 = array1 * 2
print(np.vstack((array1,array2)))

【Running】=========
[[11 12 13 14]
 [21 22 23 24]
 [31 32 33 34]
 [22 24 26 28]
 [42 44 46 48]
 [62 64 66 68]]
6.2.3 concatenate()

通过设置axis的值来设置叠加方向,axis=1时,沿水平方向叠加;axis=0时,沿垂直方向叠加

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])
array2 = array1 * 2
print(np.concatenate((array1,array2),axis=1))
print(np.concatenate((array1,array2),axis=0))

【Running】===========
[[11 12 13 14 22 24 26 28]
 [21 22 23 24 42 44 46 48]
 [31 32 33 34 62 64 66 68]]
[[11 12 13 14]
 [21 22 23 24]
 [31 32 33 34]
 [22 24 26 28]
 [42 44 46 48]
 [62 64 66 68]]
6.2.4 dstack()

dstack()是深度叠加,即增加一个维度,如两个(2,3)进行深度叠加后得到(2,3,2)的数组

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])
array2 = array1 * 2
print(np.dstack((array1,array2)))
print(np.dstack((array1,array2)).shape)

【Running】=================
[[[11 22]
  [12 24]
  [13 26]
  [14 28]]

 [[21 42]
  [22 44]
  [23 46]
  [24 48]]

 [[31 62]
  [32 64]
  [33 66]
  [34 68]]]
(3, 4, 2)

6.3 数组拆分

数组的拆分与叠加类似,有 hsplit()、vsplit()、dsplit() 以及split()函数,前三个分别对应横向拆分,纵向拆分和深度拆分,split中输入axis参数,axis=1时,沿水平方向拆分;axis=0时,沿垂直方向拆分。

7. 数组类型转换

7.1 tolist()

tolist()能将数组转换成list

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])

print(array1.tolist())

【Running】================
[[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34]]

7.2 astype()

astype()能将数组转换成指定类型

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])

print(array1.astype(float))

【Running】=================
[[11. 12. 13. 14.]
 [21. 22. 23. 24.]
 [31. 32. 33. 34.]]

8. numpy常用统计函数

请注意函数在使用时需要指定axis轴的方向,若不指定,默认统计整个数组。

  • np.sum(),返回求和
  • np.mean(),返回均值
  • np.max(),返回最大值
  • np.min(),返回最小值
  • np.ptp(),数组沿指定轴返回最大值减去最小值,即(max-min)
  • np.std(),返回标准偏差(standard deviation)
  • np.var(),返回方差(variance)
  • np.cumsum(),返回累加值
  • np.cumprod(),返回累乘积值

9. 数组的广播

当数组跟一个标量进行数学运算时,标量需要根据数组的形状进行扩展,然后执行运算。这个扩展的过程称为“广播(broadcasting)”
如我们前面用到的乘法

import numpy as np

array1 = np.array([[11, 12, 13, 14],
	               [21, 22, 23, 24],
	               [31, 32, 33, 34]])
array2 = array1 + 5
array3 = array1 * 2
print(array2)
print(array3)

【Running】=============
[[16 17 18 19]
 [26 27 28 29]
 [36 37 38 39]]
[[22 24 26 28]
 [42 44 46 48]
 [62 64 66 68]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章