[三] 1 科学计算工具:NumPy


NumPy是Python中科学计算的基础包。它提供多维数组对象ndarray,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API(包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等)。

一、ndarray数组的属性及创建

1、ndarray的属性

import numpy as np

ar = np.array([[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]])
type(ar) # numpy.ndarray

# 数组维度(轴)的个数,也称为秩(rank)
ar.ndim # 2

# 数组的维度。对于n行和m列的矩阵,shape是(n,m)
ar.shape # (2, 6)

# 数组元素的个数
ar.size # 12

# 数组中元素的类型。NumPy标准类型(int32、int16、float64等),Python标准类型,或指定dtype
ar.dtype # int32

# 数组中元素的字节大小。如int32字节数为4,float64字节数为8
ar.itemsize # 4

NumPy数据类型https://www.numpy.org.cn/user/basics/types.html#%E6%95%B0%E7%BB%84%E7%B1%BB%E5%9E%8B%E4%B9%8B%E9%97%B4%E7%9A%84%E8%BD%AC%E6%8D%A2

2、创建ndarray数组

1) array()

array()函数,参数可以是列表、元组、生成器等。

ar1=np.array([1, 2, 3, 4, 5])
ar2=np.array([(1, 2, 3, 4, 5), (1, 2, 3, 4, 5)])
ar3=np.array(range(10))

2) arange()

arange(),类似range(),返回在[开始,结束)范围内均匀间隔的值。

np.arange(6) # [0 1 2 3 4 5]
np.arange(6.0) # [ 0.  1.  2.  3.  4.  5.]
np.arange(0, 6) # [0 1 2 3 4 5]
np.arange(0.0, 6, 2) # [ 0.  2.  4.]

3) linspace()

linspace(),返回在[开始,结束]范围内的num个均匀间隔的值。
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=np.float64)
numpy.linspace(起始值,结束值,样本数,是否包含结束值,是否返回步长,dtype)

np.linspace(6, 10, 5) # [  6.   7.   8.   9.  10.]
np.linspace(6, 10, 5, endpoint = False) # [ 6.   6.8  7.6  8.4  9.2]

s = np.linspace(6, 10, 5, retstep = True) # (array([  6.,   7.,   8.,   9.,  10.]), 1.0)
type(s) # tuple

4) zeros()/zeros_like() /ones()/ones_like() /empty()/empty_like()

默认情况下,创建的数组dtype是float64类型。

zeros() /zeros_like()创建由0组成的数组;
ones() /ones_like()创建由1组成的数组;
empty() /empty_like()创建由随机数组成的数组,随机数取决于内存状态。

np.zeros(6)
'''
[ 0.  0.  0.  0.  0.  0.]
'''
np.zeros((2,5),dtype = np.int)
'''
[[0 0 0 0 0]
 [0 0 0 0 0]]
'''

ar = np.array([range(5),range(5)])
np.zeros_like(ar)
'''
[[0 0 0 0 0]
 [0 0 0 0 0]]
'''

5) eye()

创建一个N*N矩阵,对角线值为1,其余为0。

np.eye(4)
'''
[[ 1.  0.  0.  0.]
 [ 0.  1.  0.  0.]
 [ 0.  0.  1.  0.]
 [ 0.  0.  0.  1.]]
'''

二、NumPy通用函数

1、改变数组形状

1) T,转置

T函数,转置,例shape(3,4)->(4,3),(2,3,4)->(4,3,2),一维数组转置后结果不变。
生成新数组。

ar = np.zeros((2,5))
'''
[[ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]]
'''
ar.T
'''
[[ 0.  0.]
 [ 0.  0.]
 [ 0.  0.]
 [ 0.  0.]
 [ 0.  0.]]
'''

2) reshape()

改变数组形状,生成新数组,其中数组元素数量不能改变。

np.arange(16).reshape(2,8)
'''
[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]]
'''

3) resize()

ar1 = np.arange(10)
ar1.resize((2,6))
ar1 # 这种方式resize()会修改数组本身,且数组元素不够后面补0
'''
[[0 1 2 3 4 5]
 [6 7 8 9 0 0]]
'''

ar2 = np.arange(10)
ar3 = np.resize(ar2,(4,4))
ar2 # [0 1 2 3 4 5 6 7 8 9] 原数组不变
ar3 # 原数组长度不够可以重复填充
'''
[[0 1 2 3]
 [4 5 6 7]
 [8 9 0 1]
 [2 3 4 5]]
 '''

2、数组的堆叠hstack()/vstack()

a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.hstack((a,b)) # 横向连接
'''
[[1 2 5 6]
 [3 4 7 8]]
'''
np.vstack((a,b)) # 纵向连接
'''
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
'''

3、数组的拆分hsplit()/vsplit()

ar = np.arange(16).reshape((4,4))
np.hsplit(ar,2) # 沿水平轴分隔
'''
沿第2列分隔
[array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])]
'''
np.vsplit(ar,(2,3)) # 沿垂直轴分隔
'''
沿第2第3行分隔
[array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])]
'''

4、数组的复制copy()

ar1 = np.arange(6)
ar2 = ar1 # ar2和ar1指针指向同一块区域
ar3 = ar1.copy() # 复制ar1数组

5、数组数据类型的转换astype()

ar1 = np.arange(6, dtype=float) # [ 0.  1.  2.  3.  4.  5.]
ar2 = ar1.astype(np.int64) # [0 1 2 3 4 5]

6、数组简单运算

数组上的算术运算符会应用到元素级别。

ar1 = np.arange(6)
ar1 + 10      # 加   [10 11 12 13 14 15]
ar1 - 5       # 减   [-5 -4 -3 -2 -1  0]
ar1 * 2       # 乘   [ 0  2  4  6  8 10]
1 / (ar1 + 1) # 除   [ 1.          0.5         0.33333333  0.25        0.2         0.16666667]
ar1 ** 0.5    # 幂   [ 0.          1.          1.41421356  1.73205081  2.          2.23606798]

ar2 = np.arange(6).reshape((2,3))
ar2.mean()  # 求平均值   2.5
ar2.max()   # 求最大值   5
ar2.min()   # 求最小值   0
ar2.std()   # 求标准差   1.70782512766
ar2.var()   # 求方差     2.91666666667

ar2.sum()            # 求和 15
np.sum(ar2,axis=0)   # [3 5 7]
np.sum(ar2,axis=1)   # [ 3 12]

ar3 = np.array([3,2,5,6,1,4])
np.sort(ar3) # 排序 [1 2 3 4 5 6]

三、NumPy索引及切片

1、基本索引及切片

# 与python中list的索引及切片类似

ar1 = np.arange(20)
ar1        # [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
ar1[4]     # 4
ar1[:6]    # [0 1 2 3 4 5]
ar1[3::2]  # [ 3  5  7  9 11 13 15 17 19]

ar2 = np.arange(16).reshape(4,4)
ar2[1]     # [4 5 6 7]
ar2[2][2]  # 10
ar2[2,2]   # 10
ar2[2:,:2]
'''
[[ 8  9]
 [12 13]]
'''

2、布尔型索引及切片

ar = np.arange(12).reshape(3,4)
ar[np.array([True, False, True])] # 即ar[i,:]简写为ar[i]
'''
[[ 0  1  2  3]
 [ 8  9 10 11]]
'''
ar[:, np.array([True, False, True, False])]
'''
[[ 0  2]
 [ 4  6]
 [ 8 10]]
'''

ar > 5
'''
[[False False False False]
 [False False  True  True]
 [ True  True  True  True]]
'''
ar[ar > 5]
'''
[ 6  7  8  9 10 11]
'''

四、NumPy随机数random()

1、numpy.random.normal()

生成标准正态分布的随机数。

num1 = np.random.normal() # 0.437049603912014
num2 = np.random.normal(size = 4) # [-0.31053589 -0.69748997 -0.05121509  0.59734925]
num3 = np.random.normal(size = (2, 5))
'''
[[-1.1154802  -0.16761589 -1.13995188  0.70646115 -0.75743744]
 [ 0.11919076 -0.02112575 -2.3239074   0.99148759  1.03661136]]
'''

2、numpy.random.rand()/randn()

numpy.random.rand()生成[0,1)之间的随机浮点数。——均匀分布
numpy.random.randn()生成随机浮点数。——正态分布

# 生成[0,1)之间的随机浮点数
ar1 = np.random.rand() # 0.7160847111737175
ar2 = np.random.rand(2) # [ 0.82615403  0.29400575]
ar3 = np.random.rand(2,4)
'''
[[ 0.08642799  0.17083888  0.30251427  0.10624596]
 [ 0.47042193  0.64160913  0.96711666  0.74694343]]
'''

# 生成[0,100)之间的随机浮点数
ar4 = np.random.rand(6) * 100
'''
[ 23.3438487   91.81267847   6.42954629  83.24793114  62.51885077
   0.38402144]
'''
import matplotlib.pyplot as plt
% matplotlib inline

data1 = np.random.rand(1000)
data2 = np.random.rand(1000)
plt.scatter(data1,data2)
data3=np.random.randn(1000)
data4=np.random.randn(1000)
plt.scatter(data3,data4)

在这里插入图片描述在这里插入图片描述

3、numpy.random.randint()

生成一个随机整数,范围为[low, high)。如果没有写参数high的值,则范围为[0, low)。dtype只能是int类型。
numpy.random.randint(low, high=None, size=None, dtype=‘l’)

np.random.randint(3) # 生成[1,3)之间的随机整数
np.random.randint(-6, 1) # 生成[-6,1)之间的随机整数
np.random.randint(2, 6, size = (2, 3)) # 生成2*3整数数组,取值范围为[2,6)

五、NumPy数据的读取与写入

1、读取写入数组数据.npy

numpy.save()
numpy.load()

import os
os.chdir('C:\\Users\\ctsi\\Desktop')

ar = np.random.rand(3, 3)

np.save("arraydata.npy", ar) # 写

ar_load = np.load("arraydata.npy") # 读
'''
[[ 0.52189798  0.2355704   0.8649287 ]
 [ 0.91354174  0.61664467  0.22298635]
 [ 0.77108787  0.91295693  0.21203665]]
'''

2、读取写入文本数据.txt

numpy.savetxt()
numpy.loadtxt()

import os
os.chdir('C:\\Users\\ctsi\\Desktop')

ar = np.random.rand(3,3)

np.savetxt("array.txt", ar, delimiter = ",", fmt = "%.4f") # 写

ar_load_txt = np.loadtxt("array.txt", delimiter = ",") # 读 读到的格式为float64
'''
[[ 0.5219  0.2356  0.8649]
 [ 0.9135  0.6166  0.223 ]
 [ 0.7711  0.913   0.212 ]]
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值