numpy模块

一、numpy模块简介

  1. numpy的全名为numeric python,是一个开源的python科学计算库。

  2. 包含

    • 一个强大的N维数组对象ndrray

    • 比较成熟的函数库

    • 用于整合C/C++和Fortran代码的工具包

    • 实用的线性代数、傅里叶变换和随机数生成函数

  3. 优点

    • 对于同样的数值计算任务,实用numpy要比直接编写python代码便捷得多。

    • numpy中的数组的存储效率和输入输出性能均远远优于python中等价的基本数据结构,且其能够提升的性能是与数组中的元素成比例的。

    • numpy的大部分代码都是用C语言写的,其底层算法在设计时就有着优异的性能,这使得numpy比纯python代码高效的多

  4. 缺点

    • numpy使用内存映射文件以达到最优的数据读写性能,而内存的大小限制了其对TB级大文件的处理。

    • numpy数组的通用性不及python提供的list容器。

 

二、创建numpy数组

  • 创建一维的ndarray对象

import numpy as np

arr = np.array([1, 2, 3])
print(arr, type(arr))

输出
[1 2 3] <class 'numpy.ndarray'>

 

  • 创建二维的ndarray对象

import numpy as np

print(np.array([[1, 2, 3],[4, 5, 6]]))

输出
[[1 2 3]
 [4 5 6]]

 

  • 创建三维的ndarray对象

import numpy as np

print(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))

输出
[[1 2 3]
 [4 5 6]
 [7 8 9]]

import numpy as np print(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])) 输出 [[1 2 3] [4 5 6] [7 8 9]]

三、numpy数组的属性

属性 解释
T 数组的转置(对高维数组而言)
dtype 数组元素的数据类型
size 数组元素的个数
ndim 数组的维数
shape 数组的维度大小(以元组形式)
astype 类型转换

dtype种类:bool_,int(8, 16, 32, 64), float(16, 32, 64)

  • 使用方法

import numpy as np
    
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=float)
arr = arr.astype(np.int32)
print(arr)
print(arr.dtype)
print(arr.size)
print(arr.ndim)
print(arr.shape)
    
输出
[[1 2 3]
 [4 5 6]]
int32
6
2
(2, 3)
  • 获取numpy数组的行列数
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape)
print(arr.shape[0])
print(arr.shape[1])

输出
(2, 3)
2
3

四、切割numpy数组

  • ‘:’左边表示遮盖几行(列),‘:’右边表示显示几行(列)

  • 创造一个数组

arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr)
    
输出
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
  • 获取所有元素 [:, :]

print(arr[:, :])
    
输出
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
  • 获取第一行所有元素[:1, :]

print(arr[:1, :])
    
输出
[[1 2 3 4]]
  • 获取第二、三行,第三、四列的元素[1:3, 2:4]

print(arr[1:3, 2:4])
    
输出
[[ 7  8]
 [11 12]]
  • 获取第一行所有元素[0, [0, 1, 2, 3]]

print(arr[0, [0, 1, 2, 3]])
    
输出
[1 2 3 4]
  • 获取第一列所有元素[(0, 1, 2), 0]

print(arr[(0, 1, 2), 0])
    
输出
[1 5 9]
  • 获取第一行第一列的元素[0, 0]

print(arr[0, 0])
    
输出
1
  • 获取大于5的元素,返回一个数组

print(arr[arr > 5])
    
输出
[ 6  7  8  9 10 11 12]
  • 通过判断 arr>5 生成一个numpy数组

print(arr > 5)

输出
[[False False False False]
 [False  True  True  True]
 [ True  True  True  True]]

五、numpy数组元素替换

  • 创造一个数组

arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr)
    
输出
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
  • 取第一行的所有元素,并且让第一行的元素都为0

arr[:1, :] = 0
print(arr)
    
输出
[[ 0  0  0  0]
 [ 5  6  7  8]
 [ 9 10 11 12]]

 

  • 取所有大于5的数,并让大于5的元素为0

arr[arr > 5] = 0
print(arr)
    
输出
[[1 2 3 4]
 [5 0 0 0]
 [0 0 0 0]]

 

六、numpy数组的合并

  • hstack,水平合并

import numpy as np
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(np.hstack((arr1, arr2)))
    
输出
[[ 1  2  7  8]
 [ 3  4  9 10]
 [ 5  6 11 12]]
  • vstack,垂直合并

import numpy as np
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(np.vstack((arr1, arr2)))
    
输出
[[ 1  2]
 [ 3  4]
 [ 5  6]
 [ 7  8]
 [ 9 10]
 [11 12]]

 

  • Concatenate

    axis = 0 表示合并两个numpy数列的列,默认为0

    axis= 1 表示合并两个numpy数列的行

import numpy as np
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(np.concatenate((arr1, arr2), axis=1))

输出
[[ 1  2  7  8]
 [ 3  4  9 10]
 [ 5  6 11 12]]

七、通过函数创建numpy数组

方法 详解
array() 将列表转换为数组,可选择显式指定dtype
arange() range的numpy版,支持浮点数
linspace() 类似arange(),第三个参数为数组长度
zeros() 根据指定形状和dtype创建全0数组
ones() 根据指定形状和dtype创建全1数组
eye() 创建单位矩阵
empty() 创建一个元素全随机的数组
reshape() 重塑形状

 

  • array

arr = np.array([1, 2, 3])
print(arr)
    
输出
[1 2 3]
  • arange

print(np.arange(1, 20, 2))
    
输出
[ 1  3  5  7  9 11 13 15 17 19]
  • linspace

    构造一个等差数列,取头也取尾,从0取到20,取5个数

print(np.linspace(0, 20, 5))
    
输出
[ 0.  5. 10. 15. 20.]
  • logspace

    构造一个等比数列,从10^10取到10^20,取5个数

print(np.logspace(0, 20, 5))
    
输出
[1.e+00 1.e+05 1.e+10 1.e+15 1.e+20]
  • zeros

print(np.zeros((3, 4)))
    
输出
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
  • ones

print(np.ones((3, 4)))
    
输出
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
  • eye

print(np.eye(3))
    
输出
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
  • empty

print(np.empty((4, 4)))

输出
[[6.23042070e-307 1.42417221e-306 1.60219306e-306 1.11261095e-306]
 [1.42417221e-306 1.37961641e-306 6.23039015e-307 6.23053954e-307]
 [2.22522597e-306 1.06810268e-306 6.23052935e-307 1.11261434e-306]
 [8.45559303e-307 1.06811422e-306 1.05694828e-307 2.22522596e-306]]
  • reshape

arr = np.ones([2, 2], dtype=int)
print(arr.reshape(4, 1))
    
输出
[[1]
 [1]
 [1]
 [1]]

八、数组运算

运算符 说明
+ 两个numpy数组对应元素相加
- 两个numpy数组对应元素相减
* 两个numpy数组对应元素相乘
/ 两个numpy数组对应元素相除,如果都是整数则取商
% 两个numpy数组对应元素相除后取余数
**n 单个numpy数组每个元素都取n次方,如**2:每个元素都取平方

 

  • 使用方法

import numpy as np

arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(arr1 + arr2)
print()
print(arr1 ** 2)

输出
[[ 8 10]
 [12 14]
 [16 18]]

[[ 1  4]
 [ 9 16]
 [25 36]]

 

九、numpy数组运算函数

numpy数组函数 详解
np.sin(arr) 对numpy数组arr中每个元素取正弦,sin(x)
np.cos(arr) 对numpy数组arr中每个元素取余弦,cos(x)
np.tan(arr) 对numpy数组arr中每个元素取正切,tan(x)
np.arcsin(arr) 对numpy数组arr中每个元素取反正弦,arcsin(x)
np.arccos(arr) 对numpy数组arr中每个元素取反余弦,arccos(x)
np.arctan(arr) 对numpy数组arr中每个元素取反正切,arctan(x)
np.exp(arr) 对numpy数组arr中每个元素取指数函数,
np.sqrt(arr) 对numpy数组arr中每个元素开根号,

 

  • 使用方法

import numpy as np
    
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(np.sin(arr))
print()
print(np.sqrt(arr))
print()
print(np.arcsin(arr * 0.1)) # 元素不在定义内返回 nan
print()
print(np.isnan(arr)) # 判断是否为nan
    
    输出
[[ 0.84147098  0.90929743  0.14112001 -0.7568025 ]
 [-0.95892427 -0.2794155   0.6569866   0.98935825]
 [ 0.41211849 -0.54402111 -0.99999021 -0.53657292]]
     
[[1.         1.41421356 1.73205081 2.        ]
 [2.23606798 2.44948974 2.64575131 2.82842712]
 [3.         3.16227766 3.31662479 3.46410162]]
     
[[0.10016742 0.20135792 0.30469265 0.41151685]
 [0.52359878 0.64350111 0.7753975  0.92729522]
 [1.11976951 1.57079633        nan        nan]]
     
[[False False False False]
 [False False False False]
 [False False False False]]

十、numpy数组矩阵化

  1. numpy数组的点乘(dot)

    • numpy数组的点乘必须满足第一个numpy数组的列数等于第二个numpy数组的行数,即

    • 使用方法

import numpy as np
        
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8, 9], [9, 10, 11]])
        
print(np.dot(arr1, arr2))
        
输出
[[ 25  28  31]
 [ 57  64  71]
 [ 89 100 111]]

   2. numpy数组的转置(transpose)

    • 把矩阵的行列依次互换称为矩阵的转置

    • 使用方法(transpose)

import numpy as np
        
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.transpose())
print()
print(arr.T)
        
输出
[[1 4]
 [2 5]
 [3 6]]
        
[[1 4]
 [2 5]
 [3 6]]

  3. munpy数组的逆(linalg.inv)

    • 设A是数域上的一个n阶矩阵,若在相同数域上存在另一个n阶矩阵B,使得:AB=BA=E,则我们称B是A的逆矩阵。

    • 使用方法(linalg.inv)

import numpy as np
        
arr = np.array([[1, 2, 3], [4, 5, 6], [9, 8, 9]])
print(np.linalg.inv(arr))
        
输出
[[ 0.5        -1.          0.5       ]
 [-3.          3.         -1.        ]
 [ 2.16666667 -1.66666667  0.5       ]]

 

 

十一、numpy数组数学和统计方法

方法 详解
sum 求和
cumsum 累加求和
mean 求平均数
std 求标准差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引
sort 排序

 

  • 求数组所有元素中的最大值,max

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr.max())
    
输出
9
  • 求数组中每一行的最大值,max

print(arr.max(axis=0))
    
输出
[7 8 9]
  • 求数组中每一列最大元素的索引位置,argmax

print(arr.argmax(axis=1))
    
输出
[2 2 2]
  • 求所有元素的平均值,mean

print(arr.mean())

输出
5.0
  • 求每一行的平均值,mean

print(arr.mean(axis=1))
    
输出
[2. 5. 8.]
  • 求所有元素的方差,var

print(arr.var())
    
输出
6.666666666666667
  • 求每一行元素的方差,var

print(arr.var(axis=1))
        
输出
[0.66666667 0.66666667 0.66666667]
  • 求所有元素的标准差,std

print(arr.std())
    
输出
2.581988897471611
  • 求每一行的标准差,std

print(arr.std(axis=1))

输出
[0.81649658 0.81649658 0.81649658]
  • 求数组中所有元素的中位数,median

print(np.median(arr))
    
输出
5.0
  • 求数组中每一行元素的中位数,median

print(np.median(arr, axis=1))
    
输出
[2. 5. 8.]
  • 求数组中所有元素的和

print(arr.sum())
    
输出
45
  • 对数组中每一行求和

print(arr.sum(axis=1))
    
输出
[ 6 15 24]
  • 求累加和

arr = np.array([1, 2, 3, 4, 5])
print(arr.cumsum())
    
输出
[ 1  3  6 10 15]

十二、numpy.random生成随机数

函数名称 函数功能 参数说明
rand(d0,d1,⋯,dn) 产生均匀分布的随机数 dn为第n维数据的维度
randn(d0,d1,⋯,dn) 产生标准正态分布随机数 dn为第n维数据的维度
randint(low[, high, size, dtype]) 产生随机整数 low:最小值;high:最大值;size:数据个数
random_sample([size]) 在[0,1)内产生随机数 size为随机数的shape,可以为元组或者列表
choice(a, size) 从arr中随机选择指定数据 arr为1维数组;size为数组形状
uniform(low, high, size) 给定形状产生随机数组 low为最小值;high为最大值,size为数组形状
shuffle(a) 与random.shuffle相同 a为指定数组

 

  • 让数据值随机一次,之后都是相同数据,RandomState

rs = np.random.RandomState(1)
print(rs.rand(10))
    
输出
[
4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01 1.46755891e-01 9.23385948e-02
1.86260211e-01 3.45560727e-01 3.96767474e-01 5.38816734e-01]

 

  • 随机生成一个3*4数组,rand

np.random.seed(1)
print(np.random.rand(3, 4))
    
输出
[[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01]
 [1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01]
 [3.96767474e-01 5.38816734e-01 4.19194514e-01 6.85219500e-01]]
  • 构造3*4的正态分布的numpy数组,randn

print(np.random.randn(3, 4))
    
输出
[[-1.38223827 -1.42722177 -1.74047107 -0.36986561]
 [ 0.60869146  1.380522   -1.6533575   1.40307866]
 [-1.00627125 -1.0104025   0.04843809 -0.63272394]]

 

  • 构造取值为1-4内的10个元素的ndarray数组,randint

print(np.random.randint(1, 5, 10))

输出
[2 4 1 1 4 2 4 2 4 1]
  • 构造取值为0-1内的3*4的numpy数组,random_sample

print(np.random.random_sample((3, 4)))
    
输出
[[0.64239071 0.73383968 0.09981748 0.98683146]
 [0.39529641 0.98198702 0.29487973 0.43423212]
 [0.21923803 0.03519324 0.70681495 0.16788497]]
  • 随机选取arr中的两个元素,choice

arr = (np.array([1, 2, 3]))
print(np.random.choice(arr, size=2))
    
输出
[2 3]
  • 生成一个范围在(1, 5)的3*4的数组

print(np.random.uniform(1, 5, (2, 3)))
    
输出
[[1.11463202 1.33658913 4.88244568]
 [2.14444532 4.98313849 2.24619138]]
  • 将arr数组中的元素打乱

arr = (np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
np.random.shuffle(arr)
print(arr)
    
输出
[[7 8 9]
 [4 5 6]
 [1 2 3]]

 

原文地址:https://www.cnblogs.com/binyuanxiang/p/11610658.html