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
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 ]]
'''

7468

被折叠的 条评论
为什么被折叠?



