print(a2[[1,2],[4,5]])#第1行第4列和第2行第5列的元素
print(a2[1:3,4:6])#第1行到第2行 第4列到第5列的数据 即一个小矩阵
print(a2[:,1])#:代表所有行 获取第1列的元素
print(a2[:,1:3])#获取第1列到第2列的所有行元素
print(a2[:,[1,3]])#获取第1列和第3列的所有行元素
5
[3 4]
[[3 7]
[5 4]]
[0 8 5 2]
[[0 6]
[8 3]
[5 3]
[2 2]]
[[0 4]
[8 0]
[5 2]
[2 9]]
#布尔索引
a3 np.arange(24).reshape((4,6))
print(a3)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
a3 10
array([[ True, True, True, True, True, True],
[ True, True, True, True, False, False],
[False, False, False, False, False, False],
[False, False, False, False, False, False]])
a3[a3 10]
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a3[(a3 5) (a3 10)]
array([6, 7, 8, 9])
a3[(a3 5)|(a3 10)]
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])
#数组值的替换a4 np.random.randint(0,10,size (3,5))a4
array([[0, 7, 9, 4, 0], [5, 7, 8, 2, 0], [9, 7, 8, 2, 2]])
#将某一行的数替换为另一行数a4[1] np.array([1,2,3,4,5])a4
array([[0, 7, 9, 4, 0], [1, 2, 3, 4, 5], [9, 7, 8, 2, 2]])
#将某一行数全部替换为另一个数a4[0] 0a4
array([[0, 0, 0, 0, 0], [1, 2, 3, 4, 5], [9, 7, 8, 2, 2]])
#利用条件索引实现将所有小于5的数全部替换成0a4[a4 5] 0a4
array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 5], [9, 7, 8, 0, 0]])
#利用函数实现将数组中小于5的数替换成0 其余的变成1result np.where(a4 5,0,1)print(result)
[[0 0 0 0 0] [0 0 0 0 1] [1 1 1 0 0]]
1.4数组的广播机制
import numpy as np
#数组与数之间的运算
a1 np.random.randint(0,5,size (3,5))
array([[2, 1, 0, 3, 0],
[1, 3, 1, 4, 0],
[3, 1, 3, 4, 0]])
a1*2
array([[4, 2, 0, 6, 0],
[2, 6, 2, 8, 0],
[6, 2, 6, 8, 0]])
#数组与数组的计算
#shape一致
a2 np.random.randint(0,5,size (3,5))
array([[3, 4, 1, 3, 2],
[2, 3, 0, 2, 0],
[1, 3, 2, 3, 2]])
a1 a2
array([[5, 5, 1, 6, 2], [3, 6, 1, 6, 0], [4, 4, 5, 7, 2]])
#shape不一致,但其中一个数组的行或者列为1
a3 np.random.randint(0,5,size (3,1))
print(a3)
print( *30)
print(a1)
[[1]
[4]]
[[2 1 0 3 0]
[1 3 1 4 0]
[3 1 3 4 0]]
a1 a3#a3与a1的每一列都进行相加运算
array([[3, 2, 1, 4, 1],
[3, 5, 3, 6, 2],
[7, 5, 7, 8, 4]])
#shape为(3,8,2)与 8,1 或者 8,2 可以运算
#shape为 3,1,8 与 8,1 可以运算
1.5数组的形状操作
import numpy as np
#reshape resize
#reshape将数组转换成指定的形状 然后返回转换后的结果 对于原数组的形状是不会改变的
#resize将数组转换成指定的形状。会直接修改数组本身 并不会返回任何值
a1 np.random.randint(0,10,size (3,4))
array([[3, 9, 8, 6],
[5, 9, 0, 8],
[8, 0, 7, 2]])
a1.reshape((2,6))
array([[3, 9, 8, 6, 5, 9],
[0, 8, 8, 0, 7, 2]])
a1
array([[3, 9, 8, 6],
[5, 9, 0, 8],
[8, 0, 7, 2]])
a1.resize((4,3))
a1
array([[3, 9, 8], [6, 5, 9], [0, 8, 8], [0, 7, 2]])
#flatten ravel#flatten是将数组转换成一维数组后 将这个拷贝返回回去 后续对这个一维数组改变不会影响原来的数组#ravel是将数组转换为一维数组后 将这个视图返回回去 后续对这个返回值进行修改会影响之前的数组
a2 np.random.randint(0,10,size (3,4))print(a2)
[[8 1 7 6] [6 1 1 5] [5 6 6 1]]
a3 a2.flatten()a3[0] 100print(a2)
[[8 1 7 6] [6 1 1 5] [5 6 6 1]]
a4 a2.ravel()a4[0] 100print(a2)
[[100 1 7 6] [ 6 1 1 5] [ 5 6 6 1]]
#vstake,列相同增加行#hstake,行相同增加列#concatenatevstack1 np.random.randint(0,10,size (3,4))vstack1
array([[4, 5, 0, 6], [4, 9, 1, 7], [5, 1, 5, 7]])
vstack2 np.random.randint(0,10,size (2,4))vstack2
array([[0, 5, 6, 6], [4, 8, 7, 3]])
vstack3 np.vstack([vstack1,vstack2])#在前面的参数数组 叠加得到的数组中便排在前面#vstack3 np.concatenate([vstack1,vstack2],axis 1)vstack3
array([[4, 5, 0, 6], [4, 9, 1, 7], [5, 1, 5, 7], [0, 5, 6, 6], [4, 8, 7, 3]])
h1 np.random.randint(0,10,size (3,4))h1
array([[9, 2, 0, 2], [6, 0, 8, 0], [0, 9, 6, 5]])
h2 np.random.randint(0,10,size (3,1))h2
array([[1], [5], [3]])
#h3 np.hstack([h2,h1])vstack3 np.concatenate([vstack1,vstack2],axis 0)h3
array([[1, 9, 2, 0, 2], [5, 6, 0, 8, 0], [3, 0, 9, 6, 5]])
h4 np.concatenate([h2,h1],axis None)#axis 0 水平方向叠加 axis 1 垂直方向叠加 axis None 两个数组合成一个一维数组h4
array([1, 5, 3, 9, 2, 0, 2, 6, 0, 8, 0, 0, 9, 6, 5])
#hsplit指定分成几列#vsplit指定分成几行#array_split/split;参数axis axis 1按照列进行切割 axis 0按照行进行切割hs1 np.random.randint(0,10,size (3,4))print(hs1)
[[0 7 9 3] [0 6 7 0] [4 3 3 6]]
np.hsplit(hs1,2)#只有一个数字参数时 必须满足原数组的列是该参数的整倍数
[array([[0, 7], [0, 6], [4, 3]]), array([[9, 3], [7, 0], [3, 6]])]
np.hsplit(hs1,(1,2))#在第1列和第2列前进行切割
[array([[0], [0], [4]]), array([[7], [6], [3]]), array([[9, 3], [7, 0], [3, 6]])]
vs1 np.random.randint(0,10,size (4,5))print(vs1)
[[9 6 1 0 4] [6 9 6 1 2] [6 5 3 6 6] [0 3 4 2 7]]
np.vsplit(vs1,4)
[array([[9, 6, 1, 0, 4]]), array([[6, 9, 6, 1, 2]]), array([[6, 5, 3, 6, 6]]), array([[0, 3, 4, 2, 7]])]
np.vsplit(vs1,(1,3))#同上
[array([[9, 6, 1, 0, 4]]), array([[6, 9, 6, 1, 2], [6, 5, 3, 6, 6]]), array([[0, 3, 4, 2, 7]])]
np.split(hs1,4,axis 1)
[array([[0], [0], [4]]), array([[7], [6], [3]]), array([[9], [7], [3]]), array([[3], [0], [6]])]
np.split(vs1,4,axis 0)
[array([[9, 6, 1, 0, 4]]), array([[6, 9, 6, 1, 2]]), array([[6, 5, 3, 6, 6]]), array([[0, 3, 4, 2, 7]])]
#数组的转置 T或者tarnspose
t1 np.random.randint(0,10,size (3,4))print(t1)
[[9 1 7 9] [0 2 6 8] [4 2 0 6]]
t1.T
array([[9, 0, 4],
[1, 2, 2],
[7, 6, 0],
[9, 8, 6]])
t2 t1.transpose()
print( t2:n ,t2)
t2[0] 100
print( t1:n ,t1)
t2:
[[100 100 100]
[ 1 2 2]
[ 7 6 0]
[ 9 8 6]]
[[100 1 7 9]
[100 2 6 8]
[100 2 0 6]]
#两种方法都不会直接改变原数组 但是transpose方法返回的是一个视图 若对该视图进行改变则会相应修改原数组