1. 待处理的原始数据
这里有原始数据文件world_alcohol.txt
,文件内容如下:
Year,WHO region,Country,Beverage Types,Display Value
1986,Western Pacific,Viet Nam,Wine,0
1986,Americas,Uruguay,Other,0.5
1985,Africa,Cte d'Ivoire,Wine,1.62
1986,Americas,Colombia,Beer,4.27
1987,Americas,Saint Kitts and Nevis,Beer,1.98
1987,Americas,Guatemala,Other,0
1987,Africa,Mauritius,Wine,0.13
1985,Africa,Angola,Spirits,0.39
2. 读取数据
import numpy
world_alcohol = numpy.genfromtxt("world_alcohol.txt", delimiter=",", dtype=str)
print(type(world_alcohol))
delimiter
表示分隔符,这里用,
进行分割。dtype
表示读进来的数据,用string方式进行处理,如果数据中既有String
又有int
,那么通常先全部转为str
,后续可以类型转换。
打印出的结果:
也可以通过import numpy as np
的方式可以指定别名np,这里就不指定别名了
这里的ndarray
是numpy中最核心的一个结构。
打印文件内容:print(world_alcohol)
3. 查看某个函数的帮助文档
print(help(numpy.genfromtxt))
可以显示出该函数的帮助文档:
4. numpy.array
4.1 构造向量和矩阵:
vector = numpy.array([5,10,15,20])
matrix = numpy.array([[5,10,15],[20,15,30],[35,40,45]])
print(vector)
print(matrix)
打印结果如下:
- 需要注意的是,当我们通过
numpy.array
来构造一个矩阵时,里面的元素必须要相同的数据类型, 例如:
vector = numpy.array([2,4,6,8.0]) # 里面包含float类型的数据
print(vector)
print(vector.dtype)
vector = numpy.array([2,4,6,'8.0']) # 里面包含string类型的数据
print(vector)
print(vector.dtype)
打印结果如下:
那么所有的数据类型都会转换成float64
甚至是str
的类型。
4.2 查看矩阵的结构
vector = numpy.array([2,4,6,8])
print(vector.shape) # 向量
matrix = numpy.array([[2,4,6],[8,10,12]]) # 2行3列
print(matrix.shape)
查看向量或矩阵的结构:
4.3 数据处理
uruguay_other_1986 = world_alcohol[2,4]
print(uruguay_other_1986)
打印结果为:0.5
4.4 使用切片取数据
vector = numpy.array([5,10,15,20])
print(vector[0:3])
- 表示获取索引在
[0,3)
之间的数据。
打印结果[ 5 10 15]
如何获取某一列的数据?
matrix = numpy.array([[2,4,6],[8,10,12]])
print(matrix[:,1]) # 获取数据的第1列
- 其中的
:
表示所有的
,在这里表示所有的行
如何获取前两列的数据?
print(matrix[:,0:2]) # 表示获取数据第0列和第1列
4.5 对数据进行判断
matrix = numpy.array([[2,4,6],[8,10,12]])
matrix == 10
返回结果:
array([[False, False, False],
[False, True, False]])
利用判断结果进行筛选:
matrix = numpy.array([[2,4,6],[8,10,12]])
equal_to_ten = (matrix == 10)
print(equal_to_ten)
print(matrix[equal_to_ten ])
将返回的equal_to_ten
当做一个索引,对于matrix来说返回对应索引的数据。
查看某一列中是否包含某个值:
matrix = numpy.array([[2,4,6],[8,10,12]])
second_column_4 = (matrix[:,1] == 4)
print(second_column_4 )
print(matrix[second_column_4,:])
返回结果如下:
[ True False]
[[2 4 6]]
这将返回对应的数据行。
4.6 对数据进行逻辑判断
vector = numpy.array([5,10,15,20])
equal_to_ten_and_five = (vector == 10) & (vector ==5) # 判断数据既为5也为10
print(equal_to_ten_and_five)
输出结果为:[False False False False]
vector = numpy.array([5,10,15,20])
equal_to_ten_or_five = (vector == 10) | (vector ==5) # 判断数据为5或者为10
print(equal_to_ten_or_five)
输出结果为:[ True True False False]
4.7 修改数据类型
vector = numpy.array(['10', '20', '30']) # 当前数据类型为str
print(vector.dtype)
print(vector)
vector = vector.astype(float) # 将数据类型修改为float
print(vector.dtype)
print(vector)
输出结果为:
<U2
['10' '20' '30']
float64
[10. 20. 30.]
4.8 求和操作
matrix = numpy.array([[5,10,15],[20,15,30],[35,40,45]])
print(matrix.sum(axis=1)) # 按行维度进行求和
print(matrix.sum(axis=0)) # 按列维度进行求和
输出结果如下:
[ 30 65 120]
[60 65 90]
5 矩阵变换
可以使用numpy.arange(15)
创造出15个元素。
vector = numpy.arange(15) # 构造向量,包含15个元素
print("vector=",vector)
matrix = vector.reshape(3,5) # 将向量转换为3*5的矩阵
print("matrix=",matrix)
print("matrix维度:", matrix.ndim)
print("matrix的shape:", matrix.shape)
print("matrix的size:", matrix.size)
打印结果如下:
vector= [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
matrix= [[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
matrix维度: 2
matrix的shape: (3, 5)
matrix的size: 15
5.1 初始化矩阵
print(numpy.zeros((3,4))) # 创建一个3行4列的数值为0的矩阵,默认的数据类型是float
print(numpy.ones((2,3,4))) # 指定数据类型为np.int32
输出结果如下:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
5.2 初始化某一个序列的矩阵
print(numpy.arange(10, 30, 5)) # 数据从10到30,步长为5
5.3 使用random创建矩阵
print(numpy.random.random((2, 3))) # 创建一个2*3的随机矩阵
输出结果:
[[0.45187624 0.5721112 0.76078717]
[0.43637665 0.08943036 0.46525447]]
5.4 使用linespace创建等步长矩阵
print(numpy.linspace(start = 0, stop = 100, num = 5))
输出结果如下:
[ 0. 25. 50. 75. 100.]
5.5 矩阵加减法
a = numpy.array([20,30,40,50])
b = numpy.arange(4)
print("a=",a)
print("b=",b)
c = a - b # 对应数据进行相减
print("c=",c)
c = c - 1 # 每个数据都减1
print("c=",c)
print("b的2次方:", b**2)
print("a的数据是否小于35:", a < 35)
输出结果如下:
a= [20 30 40 50]
b= [0 1 2 3]
c= [20 29 38 47]
c= [19 28 37 46]
b的2次方: [0 1 4 9]
a的数据是否小于35: [ True True False False]
5.6 矩阵乘法
a = numpy.array([[1,1], [0,1]])
b = numpy.array([[2,0], [3,4]])
print(a)
print('------')
print(b)
print('------')
print(a*b) # 对应位置进行相乘
print('------')
print(a.dot(b)) # 矩阵乘法,点乘
print('------')
print(numpy.dot(a,b)) # 矩阵乘法,点乘
输出结果如下:
[[1 1]
[0 1]]
------
[[2 0]
[3 4]]
------
[[2 0]
[0 4]]
------
[[5 4]
[3 4]]
------
[[5 4]
[3 4]]
5.7 floor、ravel、转置
a = numpy.random.random((3,4)) # 生成3*4的矩阵
print(a)
b = numpy.floor(a * 10) # 对矩阵进行乘10并向下取整
print(b)
print(a.ravel()) # 将矩阵拉成一个向量
a.shape = (6,2) # 将矩阵a进行变换,修改为6*2的矩阵
print(a)
print(a.T) # 将矩阵进行转置
结果如下:
[[0.71815321 0.17789779 0.91459305 0.07703079]
[0.25360535 0.23830691 0.55384795 0.86235613]
[0.37502126 0.25378152 0.17624234 0.74019256]]
[[7. 1. 9. 0.]
[2. 2. 5. 8.]
[3. 2. 1. 7.]]
[0.71815321 0.17789779 0.91459305 0.07703079 0.25360535 0.23830691
0.55384795 0.86235613 0.37502126 0.25378152 0.17624234 0.74019256]
[[0.71815321 0.17789779]
[0.91459305 0.07703079]
[0.25360535 0.23830691]
[0.55384795 0.86235613]
[0.37502126 0.25378152]
[0.17624234 0.74019256]]
[[0.71815321 0.91459305 0.25360535 0.55384795 0.37502126 0.17624234]
[0.17789779 0.07703079 0.23830691 0.86235613 0.25378152 0.74019256]]
- 在使用shape或者reshape时可以不用指定列数,用
-1
代替,例如a.shape(6, 2)
相当于a.shape(6,-1)
5.8 矩阵拼接
a = numpy.floor(10*numpy.random.random((2, 2)))
b = numpy.floor(10*numpy.random.random((2, 2)))
print(a)
print('------')
print(b)
print('------')
print(numpy.hstack((a,b))) # 横向拼接
print('------')
print(numpy.vstack((a,b))) # 纵向拼接
输出结果为:
[[5. 2.]
[5. 8.]]
------
[[3. 5.]
[7. 9.]]
------
[[5. 2. 3. 5.]
[5. 8. 7. 9.]]
[[5. 2.]
[5. 8.]
[3. 5.]
[7. 9.]]
5.9 矩阵分割
a = numpy.floor(10*numpy.random.random((2,12)))
print(a)
print('------')
print(numpy.hsplit(a,3)) # 横向切割
print(numpy.vsplit(a,1)) # 纵向切割
输出结果:
[[0. 2. 8. 2. 3. 8. 5. 1. 1. 5. 9. 6.]
[1. 9. 3. 1. 5. 2. 5. 7. 6. 9. 5. 2.]]
------
[array([[0., 2., 8., 2.],
[1., 9., 3., 1.]]), array([[3., 8., 5., 1.],
[5., 2., 5., 7.]]), array([[1., 5., 9., 6.],
[6., 9., 5., 2.]])]
[array([[0., 2., 8., 2., 3., 8., 5., 1., 1., 5., 9., 6.],
[1., 9., 3., 1., 5., 2., 5., 7., 6., 9., 5., 2.]])]
- 如果想指定具体切割位置,可以通过元组进行设置:
print(numpy.hsplit(a,(3,4)))
5.10 不同的复制操作区别
5.10.1 使用b=a方式进行复制
a = numpy.arange(12)
b = a
print(b is a)
b.shape=(3,4)
print(a.shape)
print(id(a))
print(id(b))
输出结果:
True
(3, 4)
2215557266608
2215557266608
说明a
和b
指向的时同一个内存空间。
5.10.2 使用c = a.view()方式进行复制
a = numpy.arange(12)
c = a.view()
print(c is a)
c.shape = (3,4)
print(a.shape)
c[0,3] = 99
print(a)
print(id(a))
print(id(c))
输出结果:
False
(12,)
[ 0 1 2 99 4 5 6 7 8 9 10 11]
2215556901504
2215556876848
虽然print(c is a)
的结果为false
,id(a)
和id(a)
也不一样,但是修改c的数值对a同样发生了改变。
5.10.3 使用d = a.copy()方式进行复制
a = numpy.arange(12)
d = a.copy()
print(d is a)
d.shape = (3,4)
print(a.shape)
d[0,3] = 99
print(a)
print(id(a))
print(id(d))
输出结果:
False
(12,)
[ 0 1 2 3 4 5 6 7 8 9 10 11]
2215557266848
2215556915408
通过d = a.copy()
生成的d
与a
完全是不同的两个矩阵,只不过数据内容是一样的。
5.11 最大值
data = numpy.random.random((5,4))
print(data)
index = data.argmax(axis = 0) # 从列维度上找到最大的数据的索引
print(index)
data_max = data[index, range(data.shape[1])] # 根据行和列,获取到具体的数据
print(data_max)
输出结果:
[[0.88208481 0.5851627 0.85001307 0.65674999]
[0.09055015 0.9222699 0.68814557 0.4388229 ]
[0.83566756 0.22221162 0.71163892 0.81963848]
[0.87492499 0.75404706 0.40085437 0.26195849]
[0.96192246 0.58601327 0.98409703 0.84446547]]
[4 1 4 4]
[0.96192246 0.9222699 0.98409703 0.84446547]
5.12 矩阵扩展
a = numpy.arange(0, 40, 10)
print(a)
print('------')
b = numpy.tile(a, (2, 2)) # 将矩阵进行扩展
print(b)
print('------')
b = numpy.tile(a, (2, 3))
print(b)
输出结果:
[ 0 10 20 30]
------
[[ 0 10 20 30 0 10 20 30]
[ 0 10 20 30 0 10 20 30]]
------
[[ 0 10 20 30 0 10 20 30 0 10 20 30]
[ 0 10 20 30 0 10 20 30 0 10 20 30]]
5.13 矩阵排序
a = numpy.array([[4,3,5], [1,2,1]])
print(a)
print('------')
b = numpy.sort(a,axis=1) # 按照行进行排序
print(b)
print('------')
c = numpy.argsort(a) # 根据从小到大,返回每行数据对应的索引
print(c)
输出结果:
[[4 3 5]
[1 2 1]]
------
[[3 4 5]
[1 1 2]]
------
[[1 0 2]
[0 2 1]]