创建数组
#创建数组
import numpy as np
np.array([1,2,3,4])
array([1, 2, 3, 4])
np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
[4, 5, 6]])
np.arange(1,10,2)
array([1, 3, 5, 7, 9])
np.linspace(0,10,11,endpoint=False)
array([0. , 0.90909091, 1.81818182, 2.72727273, 3.63636364,
4.54545455, 5.45454545, 6.36363636, 7.27272727, 8.18181818,
9.09090909])
np.logspace(1,6,5,base=2)
array([ 2. , 4.75682846, 11.3137085 , 26.90868529, 64. ])
np.zeros(3)
array([0., 0., 0.])
np.ones(3)
array([1., 1., 1.])
np.zeros((3,3))
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
np.identity(2)
array([[1., 0.],
[0., 1.]])
np.empty((2,2))
array([[1., 0.],
[0., 1.]])
np.hamming(20)
array([0.08 , 0.10492407, 0.17699537, 0.28840385, 0.42707668,
0.5779865 , 0.7247799 , 0.85154952, 0.94455793, 0.9937262 ,
0.9937262 , 0.94455793, 0.85154952, 0.7247799 , 0.5779865 ,
0.42707668, 0.28840385, 0.17699537, 0.10492407, 0.08 ])
np.random.randint(0,50,(3,5))
array([[44, 20, 34, 48, 19],
[10, 2, 33, 6, 4],
[ 6, 41, 47, 13, 11]])
np.random.rand(10)
array([0.72563713, 0.21629557, 0.76766319, 0.84473172, 0.71750629,
0.33606398, 0.56846908, 0.5127654 , 0.43672247, 0.4612996 ])
np.random.standard_normal(size=(3,4,2))
array([[[ 1.80177685, -0.77487526],
[ 0.5529492 , -0.23111535],
[ 2.4712188 , 1.66871868],
[-0.77256533, -1.57496315]],
[[ 0.47400785, 0.63653893],
[ 1.59311551, -0.15445912],
[ 0.31625486, -0.72760209],
[-0.97383249, -0.01773442]],
[[-0.44467751, 0.63540944],
[-0.99232554, 0.34250728],
[-0.07851672, -0.59771674],
[ 0.0743997 , -2.17189712]]])
np.diag([1,2,3])
array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
测试两个数组的对应元素是否接近
#测试两个数组的对应元素是否接近
x = np.array([1,2,3,4.001,5])
y = np.array([1,1.999,3,4.01,5.1])
print(np.allclose(x,y))
print(np.allclose(x,y,rtol=0.2)) #相对误差
print(np.allclose(x,y,atol=0.2)) #绝对误差
print(np.isclose(x,y,))
print(np.isclose(x,y,atol=0.2))
False
True
True
[ True False True False False]
[ True True True True True]
修改数组中元素值
# 修改数组中元素值
x = np.arange(8)
x
array([0, 1, 2, 3, 4, 5, 6, 7])
np.append(x,8) #添加一个元素
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
np.append(x,[9,10]) # 添加多个元素
array([ 0, 1, 2, 3, 4, 5, 6, 7, 9, 10])
np.insert(x,1,8) # 在指定位置插入新元素
array([0, 8, 1, 2, 3, 4, 5, 6, 7])
x #不影响原来的数组,用下标方式修改会修改数组原来的值
array([0, 1, 2, 3, 4, 5, 6, 7])
数组与标量的运算
#数组与标量的运算
x = np.array([[1,2,3],[4,5,6],[7,8,9]])
x[0,2] = 4 #修改第一行第三列的元素值
x
array([[1, 2, 4],
[4, 5, 6],
[7, 8, 9]])
x[1:,1:] = 1 #切片,把行标列标大于等于1的元素值 设为 1
x
array([[1, 2, 4],
[4, 1, 1],
[7, 1, 1]])
x[1:,1:] = [1,2]
x
array([[1, 2, 4],
[4, 1, 2],
[7, 1, 2]])
x[1:,1:] = [[1,2],[3,4]] #修改多值
x
array([[1, 2, 4],
[4, 1, 2],
[7, 3, 4]])
x = np.array((1,2,3,4,5))
x
array([1, 2, 3, 4, 5])
2/x #数值除数组
array([2. , 1. , 0.66666667, 0.5 , 0.4 ])
63//x #数值除数组
array([63, 31, 21, 15, 12], dtype=int32)
数组与数组的运算
np.array([1,2,3,4]) + np.array([4,3,2,1]) #等长相加
array([5, 5, 5, 5])
np.array([1,2,3,4]) + np.array([4]) #每个元素值加 4
array([5, 6, 7, 8])
a = np.array((1,2,3))
a**a #等长可以进行 + — * / 操作
array([ 1, 4, 27], dtype=int32)
b = np.array(([1,2,3],[4,5,6],[7,8,9]))
c = a*b #不同维度数组乘法 广播 a中每个元素乘以 b 中对应列元素
c
array([[ 1, 4, 9],
[ 4, 10, 18],
[ 7, 16, 27]])
a+b #a中每个元素加 b中的对应元素
array([[ 2, 4, 6],
[ 5, 7, 9],
[ 8, 10, 12]])
数组排序
x = np.array([3,1,2])
np.argsort(x) # 返回的数组值是x数组排序大小后对应的下标
array([1, 2, 0], dtype=int64)
x[_]
array([1, 2, 3])
x = np.array([3,1,2,4])
x.argmax() , x.argmin() #最大值最小值下标
(3, 1)
x.sort() #原地排序
x
array([1, 2, 3, 4])
x = np.random.randint(1,10,(2,5))
x
array([[9, 8, 5, 1, 2],
[8, 6, 5, 5, 1]])
x.sort()
x
array([[1, 2, 5, 8, 9],
[1, 5, 5, 6, 8]])
x.sort(axis=1) #横向排序
x
array([[1, 2, 5, 8, 9],
[1, 5, 5, 6, 8]])
内积运算
# np.dot(x,y) 内积运算对应相乘在相加
访问数组中的元素
b = np.array(([1,2,3],[4,5,6],[7,8,9]))
b
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b[[0,2]] #输出第一三行
array([[1, 2, 3],
[7, 8, 9]])
b [[0,2,1],[2,1,0]] #第一个列表表示行下标 ,第二行表示列下标
array([3, 8, 4])
a = np.arange(10)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
a[4:] #从第四个元素取到末尾
array([4, 5, 6, 7, 8, 9])
a[6::-1]
array([6, 5, 4, 3, 2, 1, 0])
c =np.arange(25)
c
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24])
c.shape = 5,5 #分成5行5列
c
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
c[0,2:5] #行标为 0 列标位于 [2,5)之间
array([2, 3, 4])
c[2:5,2:5] #行列标都位于[2,5)
array([[12, 13, 14],
[17, 18, 19],
[22, 23, 24]])
c[[1,3],[2,4]] #第二行第三列 第四行第五列的元素
array([ 7, 19])
c [[1,3],2:4] #第2行第4行的第3,4列
array([[ 7, 8],
[17, 18]])
c[:,[2,3,4]] # :代表所有行 后面是对应列
c[:,2:5] #等效
array([[ 2, 3, 4],
[ 7, 8, 9],
[12, 13, 14],
[17, 18, 19],
[22, 23, 24]])
c[:,3] #第四列元素横放
array([ 3, 8, 13, 18, 23])
c[[1,3]] #第二四行
array([[ 5, 6, 7, 8, 9],
[15, 16, 17, 18, 19]])
c[[1,3]][:,[2,4]] #在第2,4行的基础上的3,5列
array([[ 7, 9],
[17, 19]])
数组对函数运算
x = np.arange(0,100,10,dtype=np.float)
print(x)
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90.]
print(np.sin(x))
[ 0. -0.54402111 0.91294525 -0.98803162 0.74511316 -0.26237485
-0.30481062 0.77389068 -0.99388865 0.89399666]
np.cos(x) #二维数组同样适用
array([ 1. , -0.83907153, 0.40808206, 0.15425145, -0.66693806,
0.96496603, -0.95241298, 0.6333192 , -0.11038724, -0.44807362])
np.round(np.cos(x)) #四舍五入
array([ 1., -1., 0., 0., -1., 1., -1., 1., -0., -0.])
x = np.array(([1,2,3],[4,5,6],[7,8,9]))
print(x/2,x.shape)
np.ceil(x/2) #向上取整
[[0.5 1. 1.5]
[2. 2.5 3. ]
[3.5 4. 4.5]] (3, 3)
array([[1., 1., 2.],
[2., 3., 3.],
[4., 4., 5.]])
改变数组形状
x = np.arange(1,11)
x
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
x.shape #查看数组形状
(10,)
x.size #查看数组的元素数量
10
x.shape = 5,-1 #-1为自动计算
x
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
x.reshape(1,10) #返回新数组 但是不能修改数组数量
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]])
x = np.arange(5)
x
x.resize(1,10) #修改数组元素的个数
np.resize(x,(1,3)) #使用numpy数组的resize()返回新数组 不对原数组进行修改
array([[0, 1, 2]])
数组布尔运算
x = np.random.rand(10)
x
array([0.73383499, 0.8942851 , 0.27774296, 0.59977826, 0.74607903,
0.7105536 , 0.82654297, 0.7011962 , 0.42712937, 0.7915964 ])
x>0.5
array([ True, True, False, True, True, True, True, True, False,
True])
x[x>0.5] #返回数组中大于0.5的元素
array([0.73383499, 0.8942851 , 0.59977826, 0.74607903, 0.7105536 ,
0.82654297, 0.7011962 , 0.7915964 ])
sum ((x>0.4) & (x<0.6)) #值大于0.4且小于0.6的元素个数
2
np.all(x<1) #全部元素小于1
True
np.any(x>0.8) #存在大于0.8的元素
True
x = np.arange(1,10)
x
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
x[(x%2==0) | (x>5)] #或运算 满足后输出值
array([2, 4, 6, 7, 8, 9])
分段函数
x = np.random.randint(0,10,size=(1,10))
x
array([[8, 7, 9, 0, 6, 0, 1, 3, 7, 3]])
np.where(x<5,0,1) #小于5 对应0 大于五对应1
array([[1, 1, 1, 0, 1, 0, 0, 0, 1, 0]])
x.resize((2,5))
x
array([[8, 7, 9, 0, 6],
[0, 1, 3, 7, 3]])
np.piecewise(x,[x<4,x>7],[lambda x : x*2,lambda x:x*3]) # 小于4的元素*2 大于7的元素*3 其他变为 0
array([[24, 0, 27, 0, 0],
[ 0, 2, 6, 0, 6]])
数组堆叠与合并
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
np.hstack((arr1,arr2)) #水平堆叠
array([1, 2, 3, 4, 5, 6])
np.vstack((arr1,arr2)) #垂直堆叠
array([[1, 2, 3],
[4, 5, 6]])
arr3 = np.array([[1],[2],[3]])
arr4 = np.array([[4],[5],[6]])
arr3
array([[1],
[2],
[3]])
arr4
array([[4],
[5],
[6]])
np.hstack((arr3,arr4))
array([[1, 4],
[2, 5],
[3, 6]])
np.vstack((arr3,arr4))
array([[1],
[2],
[3],
[4],
[5],
[6]])
np.concatenate((arr3,arr4))
array([[1],
[2],
[3],
[4],
[5],
[6]])
np.concatenate((arr3,arr4),axis=1)
array([[1, 4],
[2, 5],
[3, 6]])
本章习题
import numpy as np
np.random.randint(0,50,5)
array([12, 9, 4, 20, 47])
x = np.array([1,2,3])
y = np.array([[3],[4],[5]])
x*y
array([[ 3, 6, 9],
[ 4, 8, 12],
[ 5, 10, 15]])
x = np.array([1,2,3])
y = np.array(([1,2,3],[4,5,6],[7,8,9]))
x+y
array([[ 2, 4, 6],
[ 5, 7, 9],
[ 8, 10, 12]])