Python Numpy

Numpy

1
2
# 啥也不说 先来一波 hello
print('hello')
hello
1
2
3
4
5
6
7
# 导入 Numpy np 计算的优势
import numpy as np
nums = np.arange(1000000)
nums_list = list(range(1000000))
%time for i in range(10): nums = nums * 2
%time for i in range(10): nums_list = [j * 2 for j in nums_list]
print(nums)
Wall time: 20.4 ms
Wall time: 802 ms
[         0       1024       2048 ... 1023996928 1023997952 1023998976]
1
2
3
4
5
# np.array 创建数组
import numpy as np
arr = np.array([2, 3, 4, 5, 6])
print(str.format("新创建的数组:{}",arr))
print('新的数组为:{}'.format(arr))
新创建的数组:[2 3 4 5 6]
新的数组为:[2 3 4 5 6]
1
2
3
4
# 二维数组
import numpy as np
arr_two = np.array([[2, 3, 4],[5, 6, 7]])
print(str.format("新创建的数组:\n{}",arr_two))
新创建的数组:
[[2 3 4]
 [5 6 7]]
1
2
3
# 查看数组形状
arr.shape
arr_two.shape
(2, 3)
1
2
3
# 维度
arr.ndim
arr_two.ndim
2
1
2
# size
arr.size
5
1
2
# 元素类型
arr.dtype
dtype('int32')
1
arr.itemsize
4
1
2
3
4
5
# 定义类型
import numpy as np
arr1 = np.array([1, 2.3, 4, 5], dtype = np.float64)
print(arr1)
arr1.dtype
[1.  2.3 4.  5. ]

dtype('float64')
1
2
3
4
import numpy as np
arr1 = np.array([1, 2.3, 4, 5])
print(arr1)
arr1.dtype
[1.  2.3 4.  5. ]

dtype('float64')
1
2
3
4
# astype函数
arr2 = arr1.astype(np.float32)
print(arr2)
arr2.dtype
[1.  2.3 4.  5. ]

dtype('float32')
1
2
3
arr2 = arr1.astype(np.float32)
print(arr2)
arr2.dtype
[1.  2.3 4.  5. ]

dtype('float32')
1
np.float(10)
10.0
1
2
# np 中的 range 函数 arange
np.arange(2,7)
array([2, 3, 4, 5, 6])
1
np.zeros(5)
array([0., 0., 0., 0., 0.])
1
np.ones((4,3))
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
1
np.empty([4,4],dtype=float)
array([[6.23042070e-307, 4.67296746e-307, 1.69121096e-306,
        2.33644469e-307],
       [1.42418987e-306, 1.37961641e-306, 1.60220528e-306,
        1.24611266e-306],
       [9.34598925e-307, 1.24612081e-306, 1.11260755e-306,
        1.60220393e-306],
       [1.51320640e-306, 9.34609790e-307, 1.24610723e-306,
        1.24610723e-306]])
1
np.empty((3,4))
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
1
np.eye(5,5,1)
array([[0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0.]])
1
np.full((4,4),1)
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])
1
np.linspace(1,10,15)
array([ 1.        ,  1.64285714,  2.28571429,  2.92857143,  3.57142857,
        4.21428571,  4.85714286,  5.5       ,  6.14285714,  6.78571429,
        7.42857143,  8.07142857,  8.71428571,  9.35714286, 10.        ])
1
np.logspace(0,1,16)
array([ 1.        ,  1.1659144 ,  1.35935639,  1.58489319,  1.8478498 ,
        2.15443469,  2.51188643,  2.92864456,  3.41454887,  3.98107171,
        4.64158883,  5.41169527,  6.30957344,  7.35642254,  8.57695899,
       10.        ])

随机数

代码功能
seed确定随机数产生的种子
permutation返回一个序列的随机排列或返回一个随机排列的范围
shuffle(x)对一个序列进行随机排序
random(数量)产生一个 $[0,1)$ 之间的指定数量的随机数
rand(dim0,dim1,…)产生均匀分布的样本值得多维数组
randint(low,[high,size])产生指定范围得随机数
randn(dim0,dim1…)产生正态分布得样本值得多维数组
binomial产生二项分布得随机数组
normal产生正高斯分布得随机数
beta产生beta分布的随机数
chisquare产生卡方分布的随机数
gamma产生gamma 分布的随机数
uniform产生 $[0,1)$ 中的均匀分布随机数
1
2
import numpy as np
np.random.random(10)
array([0.7267818 , 0.10901465, 0.73051153, 0.48924036, 0.73107236,
       0.5650844 , 0.95197014, 0.93802582, 0.00792388, 0.70891063])
1
np.random.rand(3,5)
array([[0.94261821, 0.31523758, 0.22103568, 0.80398749, 0.84788616],
       [0.4409685 , 0.54924242, 0.65323153, 0.61074349, 0.53193418],
       [0.80980246, 0.30769664, 0.6696779 , 0.04090947, 0.00829057]])
1
np.random.randint(3,size=5)
array([2, 1, 0, 2, 2])
1
np.random.randint(3,8,size=5)
array([6, 7, 3, 6, 4])
1
np.random.randn(3,5)
array([[ 1.299651  ,  1.48551002,  0.95884946, -1.74687166,  0.40453426],
       [ 0.056111  , -1.23062304,  0.39156962, -0.11775158, -0.46568318],
       [-0.98578207, -0.57099212, -0.3459372 , -0.02804961, -0.10481225]])
1
2
3
4
arr6 = np.arange(10)
print(arr6)
np.random.shuffle(arr6)
print(arr6)
[0 1 2 3 4 5 6 7 8 9]
[9 0 5 2 4 7 6 8 1 3]
1
2
3
# 随机的取其中5个数字
arr7 = np.random.choice(arr6,5)
print(arr7)
[1 7 2 7 6]
1
2
3
# 一维数组的访问
arr = np.arange(10)
print("通过下标索引:%d" % arr[2])
通过下标索引:2
1
arr[-2]
8
1
2
# 切片
arr[2:5]
array([2, 3, 4])
1
arr[:5]
array([0, 1, 2, 3, 4])
1
arr[2:]
array([2, 3, 4, 5, 6, 7, 8, 9])
1
arr[:]
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
# 带步长切片
arr[::2]
array([0, 2, 4, 6, 8])
1
arr[3::2]
array([3, 5, 7, 9])
1
arr[8:2:-2]
array([8, 6, 4])
1
2
arr[0:5] = 18
print(arr)
[18 18 18 18 18  5  6  7  8  9]
1
2
arr[0:2] = 17, 19
print(arr)
[17 19 18 18 18  5  6  7  8  9]

访问多维数组

1
2
arr = np.random.randint(0,10,(5,5))
print(arr)
[[8 5 7 3 3]
 [1 8 7 9 5]
 [1 8 8 0 5]
 [3 2 1 7 9]
 [6 0 7 4 1]]
1
print("获取一个元素",arr[1][2], arr[1,2])
获取一个元素 7 7
1
print("获取一行",arr[1])
获取一行 [1 8 7 9 5]
1
2
# arr = np.array(arr)
arr[:,1]
array([5, 8, 8, 2, 0])
1
print("多行切片:\n",arr[0:2])
多行切片:
 [[8 5 7 3 3]
 [1 8 7 9 5]]
1
print("获取某行某几列 \n",arr[1:3,2:4])
获取某行某几列 
 [[7 9]
 [8 0]]
1
2
arr1 = np.array([np.eye(3,3),np.random.randint(0,10,(3,3)),np.full((3,3),1)])
print(arr1)
[[[1. 0. 0.]
  [0. 1. 0.]
  [0. 0. 1.]]

 [[4. 7. 0.]
  [3. 3. 9.]
  [7. 4. 5.]]

 [[1. 1. 1.]
  [1. 1. 1.]
  [1. 1. 1.]]]
1
print("第一行3*3数组:\n",arr1[1])
第一行3*3数组:
 [[4. 7. 0.]
 [3. 3. 9.]
 [7. 4. 5.]]

改变数组形状

1
2
3
import numpy as np
arr = np.arange(16)
print('原数组:', arr)
原数组: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
1
arr.shape
(16,)
1
2
arr.shape = (4,4)
print('改变后数组:\n',arr)
改变后数组:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
1
2
3
# 利用 reshaoe 函数
arr = arr.reshape(2,8)
print('reshape改变后的数组:\n',arr)
reshape改变后的数组:
 [[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]]
1
2
# 转置
print('数组转置:\n',arr.T)
数组转置:
 [[ 0  8]
 [ 1  9]
 [ 2 10]
 [ 3 11]
 [ 4 12]
 [ 5 13]
 [ 6 14]
 [ 7 15]]
1
2
3
# 展平
arr = np.random.randint(0,10,(3,4))
print(arr)
[[9 7 7 0]
 [4 4 2 9]
 [4 2 8 0]]
1
arr.ravel()
array([9, 7, 7, 0, 4, 4, 2, 9, 4, 2, 8, 0])
1
arr.flatten()
array([9, 7, 7, 0, 4, 4, 2, 9, 4, 2, 8, 0])
1
arr.flatten('F')
array([9, 4, 4, 7, 4, 2, 7, 2, 8, 0, 9, 0])
1
2
3
# 数组组合
arr1 = np.arange(9).reshape(3,3)
print(arr1)
[[0 1 2]
 [3 4 5]
 [6 7 8]]
1
2
arr2 = np.eye(3,4)
print(arr2)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]]
1
print('横向组合:\n',np.hstack((arr1,arr2)))
横向组合:
 [[0. 1. 2. 1. 0. 0. 0.]
 [3. 4. 5. 0. 1. 0. 0.]
 [6. 7. 8. 0. 0. 1. 0.]]
1
2
arr2 =arr2.reshape(4,3)
print('纵向组合\n',np.vstack((arr1,arr2)))
纵向组合
 [[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]
 [1. 0. 0.]
 [0. 0. 1.]
 [0. 0. 0.]
 [0. 1. 0.]]
1
2
arr3 = np.zeros((3,3))
print(arr3)
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
1
2
print('横向组合:\n',np.concatenate((arr1,arr3),axis=1))
print('纵向组合:\n',np.concatenate((arr1,arr3),axis=0))
横向组合:
 [[0. 1. 2. 0. 0. 0.]
 [3. 4. 5. 0. 0. 0.]
 [6. 7. 8. 0. 0. 0.]]
纵向组合:
 [[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
1
2
3
4
# 分割数组
import numpy as np
arr = np.arange(16).reshape(4,4)
print(arr)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
1
print("hsplit实现横向分割:\n",np.hsplit(arr,2))
hsplit实现横向分割:
 [array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])]
1
print("vsplit实现纵向分割:\n",np.vsplit(arr,2))
vsplit实现纵向分割:
 [array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])]
1
print("split实现横向分割:\n",np.split(arr,2,axis=0))
split实现横向分割:
 [array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])]

使用函数进行简单统计分析

直接排序

  • arr.sort(axis=1) 横轴排序
  • arr.sort(axis=0) 纵轴排序

间接排序

  • arr.argsort 函数返回值为重新排序值的下标

  • np.lexsort(a,axis= -1,kind=’quicksort’,order=None)函数

    返回值是按照最后一个传入的数据排序

1
2
3
4
# 排序
import numpy as np
arr = np.random.randint(0,10,size=10)
print(arr)
[2 3 7 7 2 2 7 6 6 4]
1
2
arr.sort()
print('排序后:',arr)
排序后: [2 2 2 3 4 6 6 7 7 7]
1
2
arr1 = np.random.randint(0,10,(3,3))
print(arr1)
[[5 2 3]
 [4 9 5]
 [5 6 8]]
1
2
3
# 纵轴排序
arr1.sort(axis=0)
print(arr1)
[[4 2 3]
 [5 6 5]
 [5 9 8]]
1
2
3
# 横轴排序
arr1.sort(axis=1)
print(arr1)
[[2 3 4]
 [5 5 6]
 [5 8 9]]
1
2
3
# 排序返回下标
arr2 = np.array([10,5,4,8,7,9,6,1,4])
print(arr2.argsort())
[7 2 8 1 6 4 3 5 0]
1
2
3
4
# 间接排序 按照 a 的大小排序 b 返回的是下标
a = np.array([1,5,8,7,9])
b = np.array([5,4,9,3,1])
np.lexsort((b,a))
array([0, 1, 3, 2, 4], dtype=int64)

去重

  • np.nuique 函数 找出数组中的唯一值并返回已排序的结果

重复数据

  • np.title(A,reps) 函数

    A 指定重复数组、reps指定重复的次数

  • np.repeat(a,repeats,axis=None)函数

    a 是需要重复的数组元素,repeat 是重复次数,
    axis 指定沿着哪一个轴进行重复 (0:行,1:列)

1
2
3
import numpy as np
arr = np.random.randint(0,10,10)
print(arr)
[4 5 8 6 2 3 2 9 6 1]
1
print("去重的数组为:",np.unique(arr))
去重的数组为: [1 2 3 4 5 6 8 9]
1
2
arr1 = np.arange(5)
print(arr1)
[0 1 2 3 4]
1
print("重复后的数组为:",np.tile(arr1,2))
重复后的数组为: [0 1 2 3 4 0 1 2 3 4]
1
2
arr2 = np.eye(2,2)
print(arr2)
[[1. 0.]
 [0. 1.]]
1
print('重复后的二维数组为:\n',np.tile(arr2,2))
重复后的二维数组为:
 [[1. 0. 1. 0.]
 [0. 1. 0. 1.]]
1
print('重复后的数组为:\n',np.repeat(arr2,3))
重复后的数组为:
 [1. 1. 1. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
1
print('重复后的数组为:\n',np.repeat(arr2,3,axis=0))
重复后的数组为:
 [[1. 0.]
 [1. 0.]
 [1. 0.]
 [0. 1.]
 [0. 1.]
 [0. 1.]]
1
print('重复后的数组为:\n',np.repeat(arr2,3,axis=1))
重复后的数组为:
 [[1. 1. 1. 0. 0. 0.]
 [0. 0. 0. 1. 1. 1.]]

数组集合运算

  • intersect1d(x,y): 返回 x 和 y 的交集,并排序
  • union1d(x,y): 返回 x 和 y 的并集,并排序
  • in1d(x,y): 返回一个 x 包含于 y 的布尔类型数组
  • setdiff1d(x,y): 集合的差,包含于 x 但不包含于 y
  • setxor1d(x,y): 对称差
1
2
3
arr1 = np.random.randint(10,size=10)
arr2 = np.random.randint(10,size= 16)
print(arr1,arr2,sep='\n')
[7 1 1 4 1 5 6 7 2 0]
[6 6 6 8 0 0 3 1 6 9 6 1 9 1 0 3]
1
np.intersect1d(arr1,arr2)
array([0, 1, 6])
1
np.union1d(arr1,arr2)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
np.in1d(arr1,arr2)
array([False,  True,  True, False,  True, False,  True, False, False,
        True])
1
np.setdiff1d(arr1,arr2)
array([2, 4, 5, 7])
1
np.setxor1d(arr1,arr2)
array([2, 3, 4, 5, 7, 8, 9])

通用函数

通用函数 ufunc

ufun 函数种类

1. 数组运算函数
2. 三角函数
3. 位操作函数
4. 逻辑比较运算函数
5. 浮动运算函数

ufunc 函数特点

不需要对数组的每一个元素做操作,只需要对整个数组操作。对数组做重估操作时,比 math 库的函数效率高

ufunc 函数运算

*四则运算:* + - * /

*比较运算:* > < == >= <= !=

*逻辑运算:* np.any 表示 or ,np.all 表示 and

统计运算

方法说明
sun对数组全部或者狗哥轴的元素求和 横轴求和:axis = 1 ,纵轴求和 axis = 0
mean平均数
std、var标准差、方差
min、max最小最大值
argmin、argmax最小最大值的索引
cumsum所有元素的累加和
cumprod所有元素的累积
1
2
3
import numpy as np
arr = np.array([1,2,3,4],dtype=np.float32)
print('对整个数组元素做运算:',arr*2,arr/2)
对整个数组元素做运算: [2. 4. 6. 8.] [0.5 1.  1.5 2. ]
1
2
3
import numpy as np
arr = np.arange(12).reshape((3,4))
print(arr)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
1
np.sum(arr)
66
1
np.sum(arr[2])
38
1
np.sum(arr[:,0])
12
1
arr.sum(axis=1)
array([ 6, 22, 38])
1
np.mean(arr)
5.5
1
arr.mean(axis=0)
array([4., 5., 6., 7.])
1
np.mean(arr,axis=0)
array([4., 5., 6., 7.])
1
np.min(arr)
0
1
np.cumsum(arr)
array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45, 55, 66], dtype=int32)

数组文本的输入输出

读写二进制文件

  • np.save(path,arr) 将数组的数据以u二进制的格式保存
  • np.load(path) 从二进制文件中读取数据到数组

  • np.savez(path,arr1,arr2…) 可以将多个数组保存在一个文件中

    用 load 读取保存了多个数组的二进制文件得到的不是一个数组,而是<class’numpy.liv.npyio.NpzFile’>类型,第一个数组的键 arr_0 ,以此类推,也可以为每一个数组设置键,如 np.savez(path,a=arr1,b=arr2)

  • 储存时可以省略扩展名,默认为.npy,但读取时不能省略扩展名

1
2
3
import numpy as np
arr = np.random.randn(5,4)
print(arr)
[[ 1.76691502 -1.08039441 -0.40350105  0.96406125]
 [ 0.99493877  0.21595238 -0.88694159 -0.36932894]
 [ 0.3251601   0.23230016 -0.08925341  0.96288055]
 [ 2.26122012 -0.59472853 -0.47374904 -0.67382618]
 [ 0.04607475 -0.96208061  0.09566655 -0.01934556]]
1
np.random.randn(5,4)
array([[-0.5801783 , -0.26424195,  0.49042146, -0.94756709],
       [-0.22791802,  0.5132944 , -0.36376411,  0.66883397],
       [-0.39130117, -1.46284755,  0.58822493, -0.17776915],
       [-0.72752665,  1.89162354, -0.08161553,  0.7246507 ],
       [ 0.48632646,  0.13803085, -0.15184375,  1.96561678]])
1
a = np.random.normal(2, 3, (5,5))
1
np.mean(a)
1.6551330165300795
1
2
3
4
5
6
7
8
9
10
11
12
# 保存二进制文件
import os
import numpy as np
try:
# 在当前路径下创建一个目录
os.mkdir("file")
np.save("file/datas",arr)
print("保存成功")
except(FileExistsError):
print("目录已存在!")
except:
print("保存有误!")
目录已存在!
1
2
3
# 读取二进制文件
new_arr = np.load("file/datas.npy")
print("从文件读取的数组为:\n",new_arr)
从文件读取的数组为:
 [[-1.48351205 -0.08488229  0.94531674 -0.72758347]
 [ 0.3792332   1.02024961  0.39069898  0.00791982]
 [-0.58633905  0.0622996  -0.62425041 -1.07766676]
 [-1.96618486 -0.2602688   0.03066785 -0.55700679]
 [-2.05873488  0.17521658  0.40626465  0.83277939]]
1
2
3
4
5
6
7
8
# 保存多个数组
arr1 = np.arange(10)
try:
np.savez("file/many_datas",arr,arr1)
except(FileExistsError):
print("目录已存在")
except:
print("保存有误")
1
2
3
4
5
# 读取多个数组的二进制文件
# 得到的不是一个数组 ,而是一个 Npzfile 类型,第一数组的键 arr_0
new_arr = np.load("file/many_datas.npz")
for key in new_arr:
print(new_arr[key],sep='\n')
[[ 1.76691502 -1.08039441 -0.40350105  0.96406125]
 [ 0.99493877  0.21595238 -0.88694159 -0.36932894]
 [ 0.3251601   0.23230016 -0.08925341  0.96288055]
 [ 2.26122012 -0.59472853 -0.47374904 -0.67382618]
 [ 0.04607475 -0.96208061  0.09566655 -0.01934556]]
[0 1 2 3 4 5 6 7 8 9]

读取文本文件(或csv文件)

  • np.savetxt(path,arr,fmt=”%.18e”,delimiter=’ ‘)

  • np.loadtxt(path,delimiter=’, ‘)

1
2
3
import numpy as np
arr = np.random.randn(5,4)
print(arr)
[[ 0.51666554  0.52728543 -1.67820382  0.85743429]
 [ 0.18516987 -1.53983397 -1.0383123   2.10651557]
 [-0.1205388   1.75803776 -0.38514154  1.80570042]
 [ 0.27818704  1.16017565  0.18467675 -0.68460184]
 [-0.30606144  0.06184502  0.43185454  0.4830804 ]]
1
2
3
4
5
6
7
8
9
10
# 保存文件
import os
try:
os.mkdir("file_txt")
np.savetxt("file_txt/datas.txt",arr,delimiter=',')
print("保存完成")
except(FileExistsError):
print("目录已存在")
except:
print("保存有误")
目录已存在
1
2
3
# 读取文件
new_arr = np.loadtxt("file_txt/datas.txt",delimiter= ',')
print(new_arr)
[[-0.51816154 -1.03003293 -1.46684964  0.36764561]
 [-0.40502544  0.47040483 -1.19918069  0.50684394]
 [ 0.37248315  0.19435167 -0.25253265  0.78144051]
 [ 0.43759414 -0.17827265 -1.7950681   0.0644805 ]
 [ 0.87283079  2.68541385  1.89818794 -0.45307242]]
1
2
3
4
5
from time import time
from math import exp, sqrt, log
from random import gauss, seed
z = gauss(0.0, 1.0)
print(z)
0.36641298441538733
感谢您的阅读,本文由 LEE 版权所有。如若转载,请注明出处:LEE(https://ChubbyLEE-Math.github.io/2020/07/11/Python%20Numpy/
Python Matplotlib
Python Pandas