Python库(1)—— Numpy 科学计算库

Numpy—— 科学计算库

安装nmupy: cmd窗口输入pip install numpy

import numpy as np   //引入库

定义一个ndarray

ndarray 是numpy中最基本的数据类型之一,相当于是n-dim 的array(n个维度的数组)
定义方法: np.array(x) x为list类型。

类型:<class ‘numpy.ndarray’>

array = np.array([1,2,3,4,5]) # 定义一个维度的ndarray
print (type(array))

计算

加法运算

  1. 数组与单个数值相加

    array2 = array + 1 # 数组中的每一个值与该数字相加
    # ararry2的值: array([2, 3, 4, 5, 6])
    
  2. 数组与数组相加

    array2 +array # 数组中对应的值相加
    # 结果:array([ 3,  5,  7,  9, 11])
    
  3. 元素相加
    ndarray中所有元素的相加:np.sum(array), array.sum
    axis=0: 可以按照列相加np.sum(array,axis=0),array.sum(axis=0)
    axis=0: 可以按照行相加np.sum(array,axis=1),array.sum(axis=1)

    array = np.array([[1,2,3],[4,5,6]])
    np.sum(array) #21
    array.sum # 21
    np.sum(array,axis=0) #array([5, 7, 9])
    array.sum(axis=0) #array([5, 7, 9])
    np.sum(array,axis=1) # array([ 6, 15])
    array.sum(axis=1) # array([ 6, 15])
    np.sum(array,axis=-1) # array([ 6, 15])
    

乘法运算

  1. 数组与数组相乘
    直接使用* 进行点积
    array2 * array # 数组中对应的值相乘
    # 结果:array([ 2,  6, 12, 20, 30])
    
    x = np.array([1,1,1])
    y = np.array([[1,2,3],[4,5,6]])
    print (x * y)
    '''
    [[1 2 3]
     [4 5 6]]
    '''
    

np.multiply(x,y) : 两个数组进行点积
np.dot(x,y) :根据两个数组的结构进行不同方式的相乘

x = np.array([5,5])
y = np.array([2,2])
np.multiply(x,y) # array([10, 10])
#方式一: 两个数组结构相同,返回数组中所有元素的乘积
np.dot(x,y) # 20
#方式二:两个数组结构不同,返回类似于矩阵乘法的结果,注意顺序不同时,得到的结果也不同
x=np.array([[5],
       [5]])
y=np.array([2,2])
np.dot(x,y)
'''
array([[10, 10],
       [10, 10]])
'''
np.dot(y,x) # array([[20]])
  1. 数组中的元素相乘
    array.prod(): 数组中的所有元素相乘
    array.prod(axis = 0): 按照列相乘
    array.prod(axis = 1): 按照行相乘
    array = np.array([[1,2,3],[4,5,6]])
    array.prod() # 720
    array.prod(axis = 0) # array([ 4, 10, 18])
    array.prod(axis = 1) # array([  6, 120])
    

统计量

均值:array.mean()
标准差: array.std()
方差: array.var()
axis=0时按照列求均值(标准差),axis=1时按照行求均值(标准差)

array = np.array([[1,2,3],[4,5,6]])
# 均值 
array.mean() # 3.5
array.mean(axis = 0) # array([ 2.5,  3.5,  4.5])
# 标准差
array.std() # 1.707825127659933
array.std(axis = 1) # array([ 0.81649658,  0.81649658])
# 方差
array.var() # 2.9166666666666665

逻辑运算

与:np.logical_and(x,y)
或:np.logical_or(x,y)
非:np.logical_or(x,y)
返回值是布尔类型

y = np.array([1,1,1,4])
x = np.array([1,1,1,2])
x == y
# array([ True,  True,  True, False], dtype=bool)
np.logical_and(x,y)
# array([ True,  True,  True,  True], dtype=bool)
np.logical_or(x,y)
#array([ True,  True,  True,  True], dtype=bool)
np.logical_not(x,y)
# array([0, 0, 0, 0])

索引

用“[]”进行索引和切片

索引与切片:跟Python都是一样。
索引: 从前往后时,第一个为0;从后往前时,第一个为-1.
切片: 左闭右开

array = np.array([1,2,3,4,5])
array[0] # 1
array[1:3] # array([2, 3])
array[-2:] # array([4, 5])

寻找最大值和最小值的索引位置

array.argmin(), array.argmax() : 按照从左到右,从上到下的顺序寻找最大值,最小值的位置
axis = 0 :寻找每一列最小值所在的位置
axis = 1 :寻找每一行最小值所在的位置

# 寻找索引位置
array = np.array([[1,2,3],[4,5,6]])
array.argmin() # 0
array.argmin(axis = 0) # array([0, 0, 0], dtype=int64)
array.argmin(axis=1) # array([0, 0], dtype=int64)
array.argmax() # 5

属性

数据类型

type(array): 查看array 的类型

type(array) # numpy.ndarray

array.dtype:查看array中每一个元素的类型

array.dtype # dtype('int32')

dtype还可以取int64,float32,bool,object …

对于ndarray结构来说,里面所有的元素必须是同一类型的 如果不是的话,会自动的向下进行转换

array = np.array([1,10,3.5,'str'],dtype = np.object)
# array([1, 10, 3.5, 'str'], dtype=object)
array * 2
# array([2, 20, 7.0, 'strstr'], dtype=object)

array.nbytes: array中所有元素占用字节数

array = np.array([1,2,3,4,5])
array.nbytes  #4*5=20

大小

array.itemsize : 每个元素占用的字节数

array = np.array([1,2,3,4,5])
array.itemsize # 4

array.size : 元素的个数

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

形状

查看数组的形状
查看数组的形状:array.shape,np.shape(array) 返回每个维度的大小
改变数组形状:直接对array.shape进行重新赋值

array.shape # array([1, 2, 3, 4, 5])
# (5,)
np.shape(array)
# (5,)
array3=np.array([[1,2,3],[4,5,6]])
array3.shape
# (2, 3)

# 改变shape
array = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array.shape # (10,)
array.shape = 2,5
'''
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
'''

#转置
array.shape = 2,5
'''
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
'''

注意:列表(list) 没有shape

改变数组形状
array.reshape() : 改变数组的形状

array = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

array.reshape(1,10) # array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
# 大小不能改变,若array .shape = 3,4则报错

np.newaxis: 增加新的轴

array = array[np.newaxis,:]
array.shape # (1, 10)

array = np.arange(10)
array = array[:,np.newaxis]
array.shape # (10, 1)
array = array[:,np.newaxis,np.newaxis]
array.shape # (10, 1, 1, 1)

array.squeeze() : 压缩至最底维度

array = array.squeeze()
array.shape #(10,)

数组转置
array.squeeze()array.T: 实现数组的转置

'''
'''
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
'''
'''
array.squeeze()
'''
array([[0, 5],
       [1, 6],
       [2, 7],
       [3, 8],
       [4, 9]])
'''
array.T
'''
array([[0, 5],
       [1, 6],
       [2, 7],
       [3, 8],
       [4, 9]])
'''

拼接

np.concatenate((a,b)) : 默认a,b 数组竖着拼接, axis=1时,a b 数组横向拼接

# np.concatenate
a = np.array([[123,456,678],[3214,456,134]])
b = np.array([[1235,3124,432],[43,13,134]])
c = np.concatenate((a,b)) # 竖着连接
'''
array([[ 123,  456,  678],
       [3214,  456,  134],
       [1235, 3124,  432],
       [  43,   13,  134]])
'''
c = np.concatenate((a,b),axis = 1) #横着连接
'''
array([[ 123,  456,  678, 1235, 3124,  432],
       [3214,  456,  134,   43,   13,  134]])
'''

np.vstack((a,b)) : 竖着连接
np.hstack((a,b)) :横着连接

np.vstack((a,b))
'''
array([[ 123,  456,  678],
       [3214,  456,  134],
       [1235, 3124,  432],
       [  43,   13,  134]])
'''

np.hstack((a,b))
'''
array([[ 123,  456,  678, 1235, 3124,  432],
       [3214,  456,  134,   43,   13,  134]])
'''

维度

查看维度
array.ndim : 返回维度的个数

'''
a=array([1,2,3])
'''
array.ndim # 1

降维操作
a.flatten(), a.ravel() : 将高维数组降维成1维。

'''
a= array([[ 123,  456,  678],
       [3214,  456,  134]])
'''
a.flatten()# array([ 123,  456,  678, 3214,  456,  134])
a.ravel() # array([ 123,  456,  678, 3214,  456,  134])

最值

array.min(),array.max() : 求数组中的最小值,最大值。axis = 0时按照列寻找,axis = 0时按照行寻找。

# array = np.array([[1,2,3],[4,5,6]])
array.min() # 1
array.min(axis = 0) # array([1, 2, 3])
array.min(axis = 1) # array([1, 4])
array.max() # 6

压缩

array.clip(min,max): 将小于min的数值置为min,将大于max的数值置为max。

array.clip(2,4)
'''
array([[2, 2, 3],
       [4, 4, 4]])
'''

取整

array.round() :四舍五入,设置decimals ,改变小数保留的位数。

array = np.array([1.2,3.56,6.41])
#  array([ 1.,  4.,  6.])
array.round(decimals=1)
# array([ 1.2,  3.6,  6.4])

多维

多维数组的定义,大小,形状,索引,切片

array = np.array([[1,2,3],
                  [4,5,6],
                  [7,8,9]])
array.shape # (3,3)
array.size # 9
array.ndim # 2
array[1,1] # 5
array[1,1] = 10  //'''
array([[ 1,  2,  3],
       [ 4, 10,  6],
       [ 7,  8,  9]])
'''
array[1] # array([ 4, 10,  6])
array[:,1] # array([ 2, 10,  8])
array[0,0:2] #array([1, 2])

自动生成数组

arrange

np.arrange(start,end,d) : 生成[start,end) 区间内,公差为d的等差数列。

np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array = np.arange(0,100,10) # array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
mask = np.array([0,0,0,1,1,1,0,0,1,1],dtype=bool) 
# array([False, False, False,  True,  True,  True, False, False,  True, True])
array[mask] # array([30, 40, 50, 80, 90])
np.where(tang_array > 30) #(array([3, 4], dtype=int64),)

linspace

np.linspace(start,end,n) :生成[start,end] 区间内的n个数。

array = np.linspace(0,10,10)
'''
array([  0.        ,   1.11111111,   2.22222222,   3.33333333,
         4.44444444,   5.55555556,   6.66666667,   7.77777778,
         8.88888889,  10.        ])
'''

logspace

np.linspace(start,end,n) :生成log值在[start,end] 区间内的n个数

# 默认以10为底
np.logspace(0,1,5) # array([  1.        ,   1.77827941,   3.16227766,   5.62341325,  10.        ])

meshgrid

np.meshgrid : 生成网格数据

x = np.linspace(-10,10,5)
y = np.linspace(-10,10,5)
x, y= np.meshgrid(x,y)
'''
x=y=array([[-10.,  -5.,   0.,   5.,  10.],
       [-10.,  -5.,   0.,   5.,  10.],
       [-10.,  -5.,   0.,   5.,  10.],
       [-10.,  -5.,   0.,   5.,  10.],
       [-10.,  -5.,   0.,   5.,  10.]])
'''

r_/ c_

np.r_[start,end,d] : 按照行生成[start,end) 区间内,公差为d的等差数列。
np.c_[start,end,d] : 按照生成[start,end) 区间内,公差为d的等差数列。

np.r_[0:10:1] # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.c_[0:10:1] 
'''
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
'''

zeros/ones

np.zeros : 生成全0数组
np.zeros : 生成全1数组

np.zeros(3) #array([ 0.,  0.,  0.])
np.ones((3,3)) 
'''
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
'''

array = np.array([1,2,3,4])
np.zeros_like(array)# array([0, 0, 0, 0])
np.ones_like(array) # array([1, 1, 1, 1])

fill

a.fill() : 用指定数字来填充数组

a = np.empty(6)
a.fill(1) # array([ 1.,  1.,  1.,  1.,  1.,  1.])

随机

rand

np.random.rand() : 生成大小为(0,1) 的随机数,或者随机数构成的矩阵

np.random.rand() # 0.5595234784766201
random_array = np.random.rand(10) #默认值都是从0到1
# array([0.91640149, 0.61464164, 0.81346537, 0.57917897, 0.37086614, 0.54156666, 0.47357823, 0.79819449, 0.76635931, 0.13830215])
np.random.rand(3,2)
'''
array([[ 0.87876027,  0.98090867],
       [ 0.07482644,  0.08780685],
       [ 0.6974858 ,  0.35695858]])
'''
np.random.random_sample() # 0.8279581297618884

randint

np.random.randint() : 生成正整数构成的随机数组

#返回的是随机的整数,左闭右开
np.random.randint(10,size = (5,4))
'''
array([[8, 0, 3, 7],
       [4, 6, 3, 4],
       [6, 9, 9, 8],
       [9, 1, 4, 0],
       [5, 9, 0, 5]])
'''

np.random.randint(0,10,3)# array([7, 7, 5])

randn

randn():随机样本符合标准正态分布(可能取到任意值)。 n:normal distribution(正态分布).

arr1 = np.random.randn(2,4)
print(arr1)
'''
[[-1.03021018  0.5197033   0.52117459 -0.70102661]
 [ 0.98268569  1.21940697 -1.095241   -0.38161758]]
'''

normal

np.random.normal(mu,sigma,n) : 生成均值为mu,方差为sigma呈正态分布的n个随机数

mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)
'''
array([ 0.05754667, -0.07006152,  0.06810326, -0.11012173,  0.10064039,
       -0.06935203,  0.14194363,  0.07428931, -0.07412772,  0.12112031])
'''

shuffle

np.random.shuffle(array) : 对数组中的元素位置进行洗牌

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

seed

np.random.seed() : 生成随机数的种子

np.random.seed(100)  # 当种子的值不变时,无论执行多少次生成的随机数都不变
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)
# array([-0.17,  0.03,  0.12, -0.03,  0.1 ,  0.05,  0.02, -0.11, -0.02,  0.03])

排序

sort

np.sort() : 对数组进行排序

array = np.array([[1.5,1.3,7.5],
                      [5.6,7.8,1.2]])
np.sort(array)  #默认按行排序
'''
array([[ 1.3,  1.5,  7.5],
       [ 1.2,  5.6,  7.8]])
'''
np.sort(array,axis = 0) #按照列排序
'''
array([[ 1.5,  1.3,  1.2],
       [ 5.6,  7.8,  7.5]])
'''

argsort

np.argsort(array) : 返回排序前的索引

np.argsort(array) 
'''
array([[1, 0, 2],
       [2, 0, 1]], dtype=int64)
'''

searchsorted

np.searchsorted(array,values) :对于已经排序好的数组array, 返回values在array中的插入位置

array = np.linspace(0,10,10)
'''
array([  0.        ,   1.11111111,   2.22222222,   3.33333333,
         4.44444444,   5.55555556,   6.66666667,   7.77777778,
         8.88888889,  10.        ])
'''
values = np.array([2.5,6.5,9.5])
np.searchsorted(array,values) # 在排序好的数组中插入的位置
# array([3, 6, 9], dtype=int64)

lexsort

np.lexsort : 返回按照指定方式排序前的索引

array = np.array([[1,0,6],
                       [1,7,0],
                       [2,3,1],
                       [2,4,0]])
index = np.lexsort([-1*array[:,0],array[:,2]]) # 按照第一列降序,第二列升序
# array([0, 1, 3, 2], dtype=int64)
array =array[index]
'''
array([[2, 4, 0],
       [1, 7, 0],
       [2, 3, 1],
       [1, 0, 6]])
'''

输出

精度设置

set_printoptions : 设置小数点的位数

np.set_printoptions(precision = 2)
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10) 
# array([ 0.01,  0.02,  0.12, -0.01, -0.04,  0.07,  0.14, -0.08, -0.01, -0.03])

读写

写数据

writefile : 向文件中写入数据

%%writefile file1.txt
1 2 3 4 5 6
2 3 5 8 7 9

读数据

readlines: 逐行读取数据 (比较麻烦,更推荐loadtxt方法)

data = []
with open('file1.txt') as f:
    for line in f.readlines():
        fileds = line.split()
        cur_data = [float(x) for x in fileds]
        data.append(cur_data)
data = np.array(data)
'''
data=array([[ 1.,  2.,  3.,  4.,  5.,  6.],
       [ 2.,  3.,  5.,  8.,  7.,  9.]])
'''

loadtxt : 从文件中读取数据并返回ndarray结构

data = np.loadtxt('file1.txt')
'''
array([[ 1.,  2.,  3.,  4.,  5.,  6.],
       [ 2.,  3.,  5.,  8.,  7.,  9.]])
'''

delimiter : 按照指定分割符读取数据

%%writefile tang2.txt
1,2,3,4,5,6
2,3,5,8,7,9
data = np.loadtxt('file2.txt',delimiter = ',')
'''
array([[ 1.,  2.,  3.,  4.,  5.,  6.],
       [ 2.,  3.,  5.,  8.,  7.,  9.]])
'''

skiprows : 跳过指定的行读取数据

%%writefile file3.txt
x,y,z,w,a,b
1,2,3,4,5,6
2,3,5,8,7,9
data = np.loadtxt('file3.txt',delimiter = ',',skiprows = 1)
'''
array([[ 1.,  2.,  3.,  4.,  5.,  6.],
       [ 2.,  3.,  5.,  8.,  7.,  9.]])
'''

usecols :读取指定列的数据

%%writefile tang2.txt
x,y,z,w,a,b
1,2,3,4,5,6
2,3,5,8,7,9
data = np.loadtxt('tang2.txt',delimiter = ',',skiprows = 1,usecols=(0,1,4))
'''
array([[ 1.,  2.,  5.],
       [ 2.,  3.,  7.]])
'''

存数据

np.savetxt : 保存数据,并可以指定保存的格式、分隔符

array = np.array([[1,2,3],[4,5,6]])
np.savetxt('file4.txt',array)
np.savetxt('file4.txt',array,fmt='%d')
np.savetxt('file4.txt',array,fmt='%d',delimiter = ',')
np.savetxt('file4.txt',array,fmt='%.2f',delimiter = ',')

其他读取格式

np.save(), np.load普通读写npy文件

array = np.array([[1,2,3],[4,5,6]])
np.save('array.npy',tang_array)
files = np.load('array.npy')
'''
files= array([[1, 2, 3],
       [4, 5, 6]])
'''

np.savez :压缩存储多个array(npz文件)

array2 = np.arange(10)
np.savez('filezip.npz',a=tang_array,b=tang_array2) #压缩存放
data = np.load('filezip.npz')
data.keys() # ['b', 'a']
data['a'] 
'''
array([[1, 2, 3],
       [4, 5, 6]])
'''
data['b']
'''
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
'''
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 导入numpy库 使用以下代码导入numpy库: ```python import numpy as np ``` 2. 创建numpy数组 使用以下代码创建一个numpy数组: ```python arr = np.array([1, 2, 3, 4, 5]) ``` 3. 数组计算 使用numpy数组进行数值计算: ```python # 加法 arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) arr3 = arr1 + arr2 # 减法 arr4 = arr2 - arr1 # 乘法 arr5 = arr1 * arr2 # 除法 arr6 = arr2 / arr1 # 平方 arr7 = arr1 ** 2 # 求和 arr8 = np.sum(arr1) # 均值 arr9 = np.mean(arr2) ``` 4. 数组索引和切片 使用以下代码进行数组索引和切片: ```python # 索引 arr10 = arr1[0] # 切片 arr11 = arr2[1:3] # 布尔索引 arr12 = arr1[arr1 > 2] ``` 5. 数组形状操作 使用以下代码进行数组形状操作: ```python # 改变形状 arr13 = arr1.reshape(3, 1) # 展平数组 arr14 = arr1.flatten() # 转置数组 arr15 = arr1.T ``` 6. 数组操作 使用以下代码进行数组操作: ```python # 数组拼接 arr16 = np.concatenate((arr1, arr2)) # 数组堆叠 arr17 = np.vstack((arr1, arr2)) # 数组拆分 arr18 = np.split(arr1, 2) ``` 7. 数组运算 使用以下代码进行数组运算: ```python # 数组排序 arr19 = np.sort(arr1) # 数组最大值和最小值 arr20 = np.max(arr2) arr21 = np.min(arr2) # 数组标准差和方差 arr22 = np.std(arr1) arr23 = np.var(arr2) ``` 8. 矩阵计算 使用以下代码进行矩阵计算: ```python # 矩阵乘法 arr24 = np.dot(arr1, arr2) # 矩阵转置 arr25 = arr1.T # 矩阵求逆 arr26 = np.linalg.inv(arr1) ``` 9. 随机数生成 使用以下代码生成随机数: ```python # 生成随机数 arr27 = np.random.rand(3, 3) # 生成正态分布随机数 arr28 = np.random.normal(0, 1, (3, 3)) ``` 通过以上的numpy数值计算试验过程,可以发现numpy库提供了丰富的数值计算功能和高效的数组运算能力,帮助我们更加方便和快速地进行数值计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyw2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值