Numpy基础

NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引(以下数组皆为ndarray类型,而非list类型

1.ndarray的属性

ndarray 对象是用于存放同类型元素的多维数组

属性 作用
ndim 返回int,表示数组的维数
shape 返回tuple。表述数组的尺寸,对于n行m列的矩阵,形状为(n,m)
size 返回int,表示数组的元素总数,等于数组形状的乘积
dtype 返回data-type,描述数组中元素的类型
itemsize 返回int,表示数组的每个元素的大小(以字节为单位)
import numpy as np
a=np.array([[1,2,3],[1,2,4]],dtype=np.float32)

#数组元素总数
print(a.size) #输出结果:6
# 数组的形状,多少行多少列
print(a.shape) #输出结果:(2,3)
# 数组的维数
print(a.ndim) #输出结果:2
# 数组中元素类型
print(a.dtype) #输出结果:float32

2.修改ndarray的固有属性

2.1 改变数组维度

import numpy as np
a=np.array([[1,2,3],[1,2,4]],dtype=np.float32)

# 修改数组形状
print(a.reshape(3,2))  
'''
输出结果为:
[[1. 2.]
 [3. 1.] 
 [2. 4.]]
'''

3.生成特殊数组

生成的所有数组都为ndarray类型,可构造数组:

  • 顺序数组
  • 等差数组
  • 等比数组
  • 全零多维数组
  • 单位多维数组
  • 对角线多维数组
import numpy as np

#生成顺序数组
print(np.arange(10)) # 输出结果:[0 1 2 3 4 5 6 7 8 9]
#创建等差数组
print(np.linspace(0,10,10)) #输出结果:[ 0.  1.11111111  2.22222222  3.33333333  4.44444444  5.55555556  6.66666667  7.77777778  8.88888889 10. ]
# 创建不包含结尾数字的等差数组
print(np.linspace(0,10,10,endpoint=False)) # 输出结果:[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
# 创建等比数列
print(np.logspace(0,10,10,endpoint=False,base=2)) # 输出结果:[1.  2.  4.  8.  16.  32.  64.  128.  256.  512.]
# 生成全0数组
print(np.zeros(2)) # 输出结果:[0. 0.]
# 生成两行三列的全0数组
print(np.zeros((2,3))) 
'''
输出结果为:
[[0. 0. 0.]
 [0. 0. 0.]]
'''
# 生成3阶单位数组
print(np.eye(3))
'''
输出结果为:
[[1. 0. 0.]
 [0. 1. 0.] 
 [0. 0. 1.]]
'''
# 生成元素值全为1的数组
print(np.ones(2)) # 输出结果:[1. 1.]
# 生成元素值全为1的数组
print(np.ones((2,3))) 
'''
输出结果为:
[[1. 1. 1.]
 [1. 1. 1.]]
'''
#生成指定对角线元素值的数组
print(np.diag([1,3,7])) 
'''
输出结果为:
[[1 0 0]
 [0 3 0] 
 [0 0 7]]
'''

4.生成随机数数组

生成的所有数组都为ndarray类型,可生成随机数数组:

  • 0-1之间的随机数一维数组
  • 0-1之间的随机数多维数组
  • 均匀分布的随机数多维数组
  • 正态分布的随机数多维数组
  • 0-10之间的随机数多维数组
import numpy as np

# 生成4个0-1之间的随机数数组
print(np.random.random(size=4)) #输出结果:[0.71768555 0.5947797  0.79972761 0.50824454]
# 生成0-1之间的随机数矩阵
print(np.random.random(size=(2,3)))
'''
输出结果为:
[[0.32749832 0.04388334 0.56163757]
 [0.4309314  0.0344187  0.34532551]]
'''
# 生成4个均匀分布的随机数矩阵
print(np.random.rand(2,3,2)) 
'''
输出结果为:
[[[0.66295917 0.70471342]
  [0.05790362 0.49323016] 
  [0.10871097 0.64858176]] 
 [[0.07858738 0.63434474] 
  [0.537959   0.01110871]  
  [0.53534531 0.15553675]]]
'''
# 生成正态分布的随机数矩阵
print(np.random.randn(2,3,2))
'''
输出结果为:
[[[-1.31108764  0.09089742]
  [-0.17214132 -0.41071538] 
  [-0.06360873  0.65520704]] 
 [[-0.08087163  1.73616904]  
  [ 2.27342071 -0.23829859]  
  [ 0.73271656  1.0389563 ]]]
'''
# 随机生成0-10之间的2行3列随机数矩阵
print(np.random.randint(0,10,size=(2,3)))
'''
输出结果为:
[[2 6 5] 
 [5 6 1]]
'''

5.索引与切片

5.1 一维的索引

import numpy as np

# 一维数组的索引
a=np.arange(10) #a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 数组的第三个值
print(a[2])  #输出结果:2
#数组从第三个值之后的值
print(a[2:])  #输出结果:[2 3 4 5 6 7 8 9]
#数组第六个值之前的值
print(a[:5])  #输出结果:[0 1 2 3 4]
#数组从第二个值到最后一个值
print(a[1:-1])  #输出结果:[1 2 3 4 5 6 7 8]
#数组从第二个值到最后一个值,其间步长为2
print(a[1:-1:2])  #输出结果:[1 3 5 7]

5.2 多维的索引

前为行,后为列,然后各自看切片

import numpy as np

# 多维数组的索引
b=np.random.randint(0,10,size=(2,3))
'''
输出结果为:
[[4 6 7] 
 [8 2 4]]
'''
# 输出第二行所有元素
print(b[1,:]) #输出结果:[8 2 4]
#输出第一列所有元素
print(b[:,0]) #输出结果:[4 8]
#行上全取,列上使用步长为2进行取
print(b[:,::2])
'''
输出结果为:
[[4 7] 
 [8 4]]
'''

6.降维

import numpy as np

# 多维数组的索引
b=np.random.randint(0,10,size=(2,3)) #输出结果:[[2 8 5] [6 6 3]]
# 展开多维数组变为一维数组
print(b.ravel()) #输出结果:[2 8 5 6 6 3]

7.矩阵化

7.1 矩阵化的方式

import numpy as np

#创建矩阵
print(np.mat([[1,2],[3,4]]))
'''
输出为:
[[1 2]
 [3 4]]
'''
#创建矩阵
print(np.matrix([[11,21],[31,41]]))
'''
输出为:
[[11 21]
 [31 41]]
'''

7.2 矩阵拼接

import numpy as np


a=np.mat([[1,2],[3,4]])
'''
输出为:
[[1 2]
 [3 4]]
'''
b=np.matrix([[11,21],[31,41]])
'''
输出为:
[[11 21]
 [31 41]]
'''
#横向合成矩阵
print(np.bmat('a b'))
'''
输出为:
[[ 1  2 11 21]
 [ 3  4 31 41]]
'''

7.3 矩阵乘法

import numpy as np
a=[[1,2],[3,4]]
'''
输出为:
[[1 2]
 [3 4]]
'''
b=[[1,1],[1,1]]
'''
输出为:
[[1 1]
 [1 1]]
'''

#作为矩阵相乘法一
print(np.array(a).dot(np.array(b)))
#作为矩阵相乘法二
print(np.matrix(a)*np.matrix(b))
'''
输出为:
[[3 3]
 [7 7]]
'''

7.4 矩阵转置

import numpy as np
a=np.mat([[1,1],[3,4]])
'''
输出为:
[[1 1]
 [3 4]]
'''
#使用矩阵内置算法求逆
print(a.T)
'''
输出为:
[[1 3]
 [2 4]]
'''

8.拼接

8.1 横向拼接

import numpy as np

#拼接数组
a=np.arange(10).reshape(2,5)
'''
输出结果为
[[0 1 2 3 4]
 [5 6 7 8 9]]
'''

b=np.linspace(0,1,endpoint=False,num=10).reshape(2,5)
'''
输出结果为
[[0.  0.1 0.2 0.3 0.4]
 [0.5 0.6 0.7 0.8 0.9]]
'''

#横向拼接法一
print(np.vstack((a,b)))
#横向拼接法二
print(np.concatenate((a,b),axis=0))
'''
输出结果为
[[0.  1.  2.  3.  4. ]
 [5.  6.  7.  8.  9. ]
 [0.  0.1 0.2 0.3 0.4]
 [0.5 0.6 0.7 0.8 0.9]]
'''

8.2 纵向拼接

import numpy as np

#拼接数组
a=np.arange(10).reshape(2,5)
'''
输出结果为
[[0 1 2 3 4]
 [5 6 7 8 9]]
'''
b=np.linspace(0,1,endpoint=False,num=10).reshape(2,5)
'''
输出结果为
[[0.  0.1 0.2 0.3 0.4]
 [0.5 0.6 0.7 0.8 0.9]]
'''
#纵向拼接法一
print(np.hstack((a,b)))
#纵向拼接法二
print(np.concatenate((a,b),axis=1))
'''
输出结果为
[[0.  1.  2.  3.  4.  0.  0.1 0.2 0.3 0.4]
 [5.  6.  7.  8.  9.  0.5 0.6 0.7 0.8 0.9]]
'''

9.分割

9.1 横向分割

import numpy as np

a=np.arange(36).reshape(6,6)
'''
输出结果为:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]
'''
#横向分割数组法一
print(np.hsplit(a,3))
#横向分割数组法二
print(np.split(a,3,axis=1))
'''
输出结果为:
[array([[ 0,  1],
        [ 6,  7],
        [12, 13],
        [18, 19],
        [24, 25],
        [30, 31]]), 
 array([[ 2,  3],
        [ 8,  9],
        [14, 15],
        [20, 21],
        [26, 27],
        [32, 33]]),
 array([[ 4,  5],
        [10, 11],
        [16, 17],
        [22, 23],
        [28, 29],
        [34, 35]])]
'''

9.2 纵向分割

import numpy as np

a=np.arange(36).reshape(6,6)
'''
输出结果为:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]
'''
#纵向分割数组法一
print(np.vsplit(a,3))
#横向分割数组法二
print(np.split(a,3,axis=0))
'''
输出结果为:
[array([[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]]),
 array([[12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23]]), 
 array([[24, 25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34, 35]])]
'''

10.数据读取和保存

10.1 npy文件

import numpy as np
a=np.random.random((3,3))
'''
输出为:
[[0.50212588 0.25281993 0.29829224]
 [0.73546263 0.28386965 0.68986956]
 [0.14592709 0.71318903 0.3625369 ]]
'''
#保存一个ndarray数组到npy文件
np.save('./tmp/tmp.npy',a)
#读取npy文件
print(np.load('./tmp/tmp.npy'))
'''
输出为:
[[0.50212588 0.25281993 0.29829224]
 [0.73546263 0.28386965 0.68986956]
 [0.14592709 0.71318903 0.3625369 ]]
'''

10.2 npz文件

import numpy as np
a=np.random.random((3,3))
'''
输出为:
[[0.50212588 0.25281993 0.29829224]
 [0.73546263 0.28386965 0.68986956]
 [0.14592709 0.71318903 0.3625369 ]]
'''
b=np.random.randn(2,2)
'''
输出为:
[[ 0.19706792 -0.74165399]
 [ 0.55448015  1.753524  ]]
'''

#保存多个ndarray数组到npz文件
np.savez('./tmp/tmp2.npz',a,b)
#读取npz文件
d=np.load('./tmp/tmp2.npz')
#展示有哪些ndarray数据
print(d.files) #输出为:['arr_0', 'arr_1']
#逐个展示npz文件里各个ndarray数据
print(d['arr_0'])
'''
输出为:
[[0.50212588 0.25281993 0.29829224]
 [0.73546263 0.28386965 0.68986956]
 [0.14592709 0.71318903 0.3625369 ]]
'''
print(d['arr_1'])
'''
输出为:
[[ 0.19706792 -0.74165399]
 [ 0.55448015  1.753524  ]]
'''

10.3 txt文件

import numpy as np

a=np.random.random((3,3))
'''
输出为:
[[0.51002495 0.64689764 0.97295432]
 [0.42998593 0.21590222 0.65957127]
 [0.13704206 0.55542585 0.525483  ]]
'''
np.savetxt('./tmp/tmp3.txt',a)

#常规导入
print(np.loadtxt('./tmp/tmp3.txt'))
#可以进行填充缺失值的导入方式
print(np.genfromtxt('./tmp/tmp3.txt'))
'''
输出为:
[[0.51002495 0.64689764 0.97295432]
 [0.42998593 0.21590222 0.65957127]
 [0.13704206 0.55542585 0.525483  ]]
'''

11.数据的处理

11.1 乘法

import numpy as np
a=[[1,2],[3,4]]
b=[[1,1],[1,1]]

#作为二维数组进行相乘
print(np.array(a)*np.array(b))
'''
输出为:
[[1 2]
 [3 4]]
'''

11.2 广播计算

import numpy as np

#广播计算
a=[[0]*3,[1]*3,[2]*3,[3]*3]
print(a)
'''
输出为:
[[0, 0, 0], 
 [1, 1, 1], 
 [2, 2, 2], 
 [3, 3, 3]]
'''
print(np.array(a)+np.array([1,2,3]))
'''
输出为:
[[1 2 3]
 [2 3 4]
 [3 4 5]
 [4 5 6]]
'''
print(np.array(a)+np.array([[1],[2],[3],[4]]))
'''
输出为:
[[1 1 1]
 [3 3 3]
 [5 5 5]
 [7 7 7]]
'''

11.2 去重、排序、均值等计算

import numpy as np

#读取iris数据集里的数据,并对其进行排序,去重,并求出和,累积和,均值,标准差,方差,最小值,最大值
data=np.loadtxt('./data/iris_sepal_length.csv')
#进行排序
data.sort()
#数据去重
data=np.unique(data)
#求和
print(np.sum(data)) #输出为:210.39999999999998
print(np.cumsum(data))
'''
输出为:
[  4.3   8.7  13.2  17.8  22.5  27.3  32.2  37.2  42.3  47.5  52.8  58.2
  63.7  69.3  75.   80.8  86.7  92.7  98.8 105.  111.3 117.7 124.2 130.8
 137.5 144.3 151.2 158.2 165.3 172.5 179.8 187.2 194.8 202.5 210.4]
'''
print(np.mean(data)) #求均值 输出为:6.011428571428571
print(np.std(data)) #求标准差 输出为:1.0289443768310533
print(np.var(data)) #求方差 输出为:1.0587265306122449
print(np.min(data)) #求最小值 输出为:4.3
print(np.max(data)) #求最大值 输出为:7.9

12.参考文章

菜鸟教程-Numpy

【创作不易,望点赞收藏,若有疑问,请留言,谢谢】

posted @ 2022-06-29 10:04  东血  阅读(57)  评论(0编辑  收藏  举报

载入天数...载入时分秒...