numpy入门

本文详细介绍了如何使用 NumPy 处理数据,包括读取 CSV 文件,查看函数帮助,创建向量和矩阵,数据类型转换,以及各种矩阵操作如切片、判断、求和、矩阵乘法等。此外,还涵盖了矩阵的变换、初始化、拼接、分割以及复制操作,深入讲解了矩阵的索引、排序和最大值查找。最后,探讨了不同复制方式的差异,展示了如何进行矩阵扩展和排序。
摘要由CSDN通过智能技术生成

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

说明ab指向的时同一个内存空间。

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)的结果为falseid(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()生成的da完全是不同的两个矩阵,只不过数据内容是一样的。

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]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值