python 科学计算库Numpy

时间:2024-01-22 20:27:47

读取文件

numpy.gerfromtxt()用于读取文件,其中传入的参数依次是:

  1、需要读取txt文件位置,此处文件与程序位于同一目录下

  2、delimiter 分割的标记

  3、dtype 转换类型,如果文件中既有文本类型也有数字类型,就先转成文本类型

help(numpy.genformtxt)用于查看帮助文档

1 import numpy
2  
3 world_alcohol = numpy.genfromtxt("world_alcohol.txt", delimiter=",",dtype=str)
4 print(type(world_alcohol))
5 print(world_alcohol)
6 print(help(numpy.genfromtxt))
View Code

构造ndarray

numpy.array()中传入数组参数,可以是一维的也可以是二维三维的,numpy会将其转变成ndayyay结构。

 1 import numpy
 2 vector = numpy.array([1,2,3,4])
 3 matrix = numpy.array([[1,2,3],[4,5,6]])
 4 print(vector)
 5 print("----------------------")
 6 print(matrix)
 7 # [1 2 3 4]
 8 # ----------------------
 9 # [[1 2 3]
10 #  [4 5 6]]
View Code

注意:传入的参数必须是同一结构,不是同一结构将会发生转换

1 import numpy
2 vector1 = numpy.array([1,2,3,4.])
3 vector2 = numpy.array([1,2,3,4])
4 vector3 = numpy.array([1,2,'3',4])
5 print(vector1)  # [1. 2. 3. 4.]
6 print(vector2)  # [1,2,3,4]
7 print(vector3)  # ['1' '2' '3' '4']
View Code

利用.shape查看结构

1 import numpy
2 vector = numpy.array([1,2,3,4])
3 matrix = numpy.array([[1,2,3],[4,5,6]])
4 print(vector.shape)
5 print(matrix.shape)
6 
7 # (4,)
8 # (2, 3)
View Code

利用.dtype查看类型

1 import numpy
2 vector = numpy.array([1,2,3,4])
3 print(vector.dtype)# int32
View Code

利用.ndim查看维度

1 import numpy
2 vector = numpy.array([1,2,3,4])
3 matrix = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
4 print(vector.ndim)# 1
5 print(matrix.ndim)# 2
View Code

利用.size查看元素的数量

print(matrix.size)  # 9

获取与计算

切片索引取值

vector = numpy.array([5, 10, 15, 20])

print(vector[0:3])  # 切片索引取值# [ 5 10 15]

利用返回值获取元素

import numpy
vector = numpy.array([5, 10, 15, 20])
print(vector == 10)   # [False  True False False]
# 利用返回值获取元素
print(vector[vector == 10])# [10]

将整型类型进行转换

vector = vector.astype(str)
print(vector.dtype)# <U11

求和

matrix = numpy.array([[1,2,3],
                      [4,5,6],
                     [7,8,9]])
print(matrix.sum())# 45
print(matrix.sum(1))# 按每行求和 # [ 6 15 24]
print(matrix.sum(0))# 按每列求和 # [12 15 18]

sum(1) 是 sum(axis=1)) 的缩写,1表示按照 x轴方向求和,0表示按照y轴方向求和

常用函数

reshape:生成0-14的15个数字,使用reshape(3,5)将其构造成一个三行五列的array

1 import numpy as np
2 arr = np.arange(15).reshape(3, 5)
3 arr
4  
5 array([[ 0,  1,  2,  3,  4],
6        [ 5,  6,  7,  8,  9],
7        [10, 11, 12, 13, 14]])
View Code

zero:生成指定结构的默认为0.的array

1 np.zeros ((3,4))
2  
3 #array([[ 0.,  0.,  0.,  0.],
4 #       [ 0.,  0.,  0.,  0.],
5 #       [ 0.,  0.,  0.,  0.]])
View Code

ones:生成一个三维的array,通过dtype指定类型

1 np.ones( (2,3,4), dtype=np.int32 )
2  
3 # array([[[1, 1, 1, 1],
4 #         [1, 1, 1, 1],
5 #         [1, 1, 1, 1]],
6  
7 #        [[1, 1, 1, 1],
8 #         [1, 1, 1, 1],
9 #         [1, 1, 1, 1]]])
View Code

numpy.linspace(startstopnum=50endpoint=Trueretstep=Falsedtype=None)

在指定间隔[start, stop]之间返回均匀num个数字,如果endpoint是True,则不会取最后一个端点stop

np.linspace(2.0, 3.0, num=5)
# array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ])
np.linspace(2.0, 3.0, num=5, endpoint=False)
# array([ 2. ,  2.2,  2.4,  2.6,  2.8])

arange指定范围和数值间的间隔array,注意范围包左不包右

1 np.arange(0,10,2)
2  
3 # array([0, 2, 4, 6, 8])
View Code

random随机数:生成指定结构的随机数,可以用于生成随机权重

1 np.random.random((2,3))
2  
3 # array([[ 0.86166627,  0.37756207,  0.94265883],
4 #        [ 0.9768257 ,  0.96915312,  0.33495431]])
View Code

ndarray运算:矩阵之间的相加、相减、开根号、e平方

 1 a = np.array([10,20,30,40])
 2 b = np.array(4)
 3  
 4 print(a - b)    # array([ 6, 16, 26, 36])
 5 print(a**2) # array([ 100,  400,  900, 1600])
 6 print(np.sqrt(B))   # array([[ 1.41421356,  0.        ],
 7                         # [ 1.73205081,  2.        ]])
 8 
 9 print(np.exp(B))    # array([[  7.3890561 ,   1.        ],
10                         # [ 20.08553692,  54.59815003]])
View Code

向下取整np.floor()和向下取整np.ceil()

 1 import numpy as np
 2 a = np.floor(10*np.random.random((2,2)))
 3 print(a)
 4 a = np.ceil(np.random.random((2,2)))
 5 print(a)
 6 
 7 # [[2. 8.]
 8 #  [5. 0.]]
 9 #######################
10 # [[1. 1.]
11 #  [1. 1.]]
View Code

转置(行列变换)a.T

1 import numpy as np
2 a = np.array([[1,2],[3,4]])
3 print(a)
4 print(a.T)# 转置
5 # [[1 2]
6 #  [3 4]]
7 ################
8 # [[1 3]
9 #  [2 4]]
View Code

变换结构a.resize(1,4)

1 import numpy as np
2 a = np.array([[1,2],[3,4]])
3 a.resize(1,4)
4 a# array([[1, 2, 3, 4]])
View Code

矩阵运算

A*B

A.dot(B)

np.dot(A,B)

 1 import numpy as np
 2 A = np.array( [[1,1],
 3                [0,1]] )
 4 B = np.array( [[2,0],
 5                [3,4]] )
 6 print(A*B)
 7 
 8 print (A.dot(B))# A*B
 9 print(np.dot(A,B))# A*B
10 # [[2 0]
11 #  [0 4]]
View Code

横向相加 np.hstack(a,b)

 1 a = np.floor(10*np.random.random((2,2)))
 2 b = np.floor(10*np.random.random((2,2)))
 3  
 4 print(a)
 5 print(b)
 6 print(np.hstack((a,b)))
 7  
 8 # [[ 2.  3.]
 9 # [ 9.  3.]]
10 # [[ 8.  1.]
11 # [ 0.  0.]]
12 # [[ 2.  3.  8.  1.]
13 # [ 9.  3.  0.  0.]]
View Code

纵向相加 np.vstack(a,b)

1 print(np.vstack((a,b)))
2  
3 # [[ 2.  3.]
4 # [ 9.  3.]
5 # [ 8.  1.]
6 # [ 0.  0.]]
View Code

矩阵纵向切割np.hsplit(a,3)  # 把a竖切成3分

 1 a = np.floor(10*np.random.random((2,12)))
 2 print(a)
 3 print(np.hsplit(a,3))
 4 
 5 # [[1. 4. 9. 1. 7. 2. 6. 3. 5. 4. 1. 8.]
 6 #  [0. 0. 4. 4. 7. 9. 1. 6. 7. 3. 9. 2.]]
 7 
 8 
 9 #  [array([[1., 4., 9., 1.],
10 #        [0., 0., 4., 4.]]), 
11 #  array([[7., 2., 6., 3.],
12 #        [7., 9., 1., 6.]]), 
13 #  array([[5., 4., 1., 8.],
14 #        [7., 3., 9., 2.]])]
View Code

矩阵横向切割 np.vsplit(a,3)  # 把a横的切成3分

 1 b = np.floor(10*np.random.random((12,2)))
 2 print(b)
 3 print(np.vsplit(b,3))
 4 
 5 # [[8. 0.]
 6 #  [9. 1.]
 7 #  [9. 1.]
 8 #  [7. 7.]
 9 #  [7. 1.]
10 #  [9. 0.]
11 #  [8. 0.]
12 #  [7. 4.]
13 #  [8. 8.]
14 #  [7. 5.]
15 #  [9. 8.]
16 #  [1. 5.]]
17 
18 [array([[8., 0.],
19        [9., 1.],
20        [9., 1.],
21        [7., 7.]]), 
22 array([[7., 1.],
23        [9., 0.],
24        [8., 0.],
25        [7., 4.]]), 
26 array([[8., 8.],
27        [7., 5.],
28        [9., 8.],
29        [1., 5.]])]
View Code

复制的区别

地址复制:通过 b = a 复制 a 的值,b 与 a 指向同一地址,改变 b 同时也改变 a。

 1 a = np.arange(12)
 2 b = a
 3 print(a is b)
 4  
 5 print(a.shape)
 6 print(b.shape)
 7 b.shape = (3,4)
 8 print(a.shape)
 9 print(b.shape)
10  
11 # True
12 # (12,)
13 # (12,)
14 # (3, 4)
15 # (3, 4)
View Code

复制值:通过 a.view() 仅复制值,当对 c 值进行改变会改变 a 的对应的值,而改变 c 的 shape 不改变 a 的 shape,只有值会变,矩阵结构不变

 1 a = np.arange(12)# [ 0  1  2  3  4  5  6  7  8  9 10 11]
 2 c = a.view()
 3 print(c is a)
 4 
 5 c.shape = (2,6)
 6 c[0,0] = 9999
 7  
 8 print(a)
 9 print(c)
10  
11 # False
12 # [9999    1    2    3    4    5    6    7    8    9   10   11]
13 # [[9999    1    2    3    4    5]
14 # [   6    7    8    9   10   11]]
View Code

完全拷贝:a.copy() 进行的完整的拷贝,产生一份完全相同的独立的复制

 1 a = np.arange(12)
 2 c = a.copy()
 3 print(c is a)
 4  
 5 c.shape = 2,6
 6 c[0,0] = 9999
 7  
 8 print(a)
 9 print(c)
10  
11 # False
12 # [ 0  1  2  3  4  5  6  7  8  9 10 11]
13 # [[9999    1    2    3    4    5]
14 # [   6    7    8    9   10   11]]
View Code

numpy.random 模块

numpy的random模块用于生成随机数,

numpy.random.rand(D0d1...DN):给定形状的数组,并在[0,1)之间

np.random.rand(3,2)
# array([[ 0.14022471,  0.96360618],  #random
#        [ 0.37601032,  0.25528411],  #random
#        [ 0.49313049,  0.94909878]]) #random

numpy.random.randn(D0d1...DN):从“标准正态分布”返回一个或多个样本

a = np.random.randn(2, 4)
# [[-0.9115162  -1.32887292 -1.02910152  0.8023337 ]
#  [-1.14456771 -0.53251834 -1.75465906 -1.25668335]]

numpy.random.standard_normal(size=None):从标准正态分布中随机取样

s = np.random.standard_normal((2,2))
# [[-1.29260636 -0.02517569]
#  [ 0.85794393 -0.21145319]]

numpy.random.randint(low, high=None, size=None, dtype='l'):生成[low,high)的随机整数,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

a = np.random.randint(5, size=(2, 4))
# array([[4, 0, 2, 1],
#        [3, 2, 2, 0]])

b = np.random.randint(5,10,size=(2, 4))
# [[6 9 8 5]
#  [8 8 6 8]]

numpy.random.random_integers(low, high=None, size=None):生成一个整数或一个N维整数数组,取值范围:若high不为None,则取[low,high]之间随机整数,否则取[1,low]之间随机整数。

numpy.random.random_sample(size=None):生成一个[0,1)之间随机浮点数或N维浮点数组。

numpy.random.choice(a, size=None, replace=True, p=None):从序列中获取元素,若a为整数,元素取值为np.range(a)中随机数;若a为数组,取值为a数组元素中随机元素。

numpy.random.shuffle(x):对X进行重排序,如果X为多维数组,只沿第一条轴洗牌(横轴),输出为None。

arr = np.arange(9).reshape((3, 3))
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]
np.random.shuffle(arr)
# [[3 4 5]
#  [0 1 2]
#  [6 7 8]]

numpy.random.seed(seed=None)    # 种下随机种子,使得生成的随机数相同

 

参考文献

参考博客

NumPy官方文档

CSDN博客Numpy之random学习