基础索引与切片
ar=np.arange(10)
print('一维数组索引同列表')
print(ar)
print(ar[4])#元素从0开始编号,ar[4]实际上是ar中第五个元素
print(ar[:3])#冒号表示从头开始的省略,0,1,2
print(ar[::3])#可以通过索引设置步长,步长为3
print('\n二维数组')
ar2=np.arange(12).reshape(4,3)
print('ar2\n',ar2)
print('ar2.ndim 轴数',ar2.ndim)
print('ar2[1] 因轴数为2得到一维数组切片',ar2[1])#从0开始,只有一个参数的时候表示第一个轴,即行
print('ar2[1:3]',ar2[1:3])#ar第一行到第四行
print('ar2[2][2]',ar2[2][2])#ar的第三行第三列
print('ar2[2,2]',ar2[2,2])
print('\n三维数组')
ar3=np.random.randint(10,size=(3,4,5))
print(ar3)
print('ar3.ndim 轴数',ar3.ndim)
print('ar3.shape',ar3.shape)# 3个4*5的数组
print('ar3[1]\n ',ar3[1])#在第一个轴上,返回一个4*5的数组
print('ar3[1:3]\n ',ar3[1:3])
print('ar3[1][2]\n ',ar3[1][2])#第二个参数表示第二个轴,即从ar3[1]对应的4*5数组上,返回第3行
print('ar3[1,2]\n',ar3[1,2])
#多维数组...表示省略
print('ar3[1,...]\n',ar3[1,...])# 第一个轴上第2个元素same as ar3[1,:,:] or ar3[1]
print('ar3[...,2]\n',ar3[...,2])# 第三个轴上第3个元素same as ar3[:,:,2]
'''
这个比较容易错!注意!
ar3[1,...]
[[6 9 5 4 2]
[7 7 6 2 3]
[2 6 3 7 6]
[5 4 6 6 2]]
ar3[...,2]
[[1 9 6 5]
[5 6 3 6]
[9 9 6 7]]
'''
bool索引切片
ar[x,:] 对行进行bool切片,每一行和x中bool值对应,True则保留
ar[:,y] 对列进行bool切片,每一列和y中bool值对应,True则保留
可以利用判别条件形成bool值进行整个数组的索引及切片
ar=np.arange(12).reshape(4,3)
x=np.array([True,False,False,True])
y=np.array([True,False,True])
print('ar\n',ar)
print('x:%s y:%s'%(x,y))
print(ar[x,:])#保留True对应的行 等价于ar[x]
print(ar[:,y])#保留True对应的列
#bool索引切片决定数组也可以用判断条件形成判断矩阵来进行索引及切片
xy=ar<3
print(xy)
print(ar[xy])
'''
ar
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
x:[ True False False True] y:[ True False True]
[[ 0 1 2]
[ 9 10 11]]
[[ 0 2]
[ 3 5]
[ 6 8]
[ 9 11]]
[[ True True True]
[False False False]
[False False False]
[False False False]]
[0 1 2]
'''
索引切片与copy
对索引直接赋值改变原始数组,所以索引常常与copy一起使用生成新数组
对经copy得到的数组操作时,不改变原数组
#索引切片与copy
ar=np.arange(6)
print('ar',ar)
ar[3:5]=99
print(ar)#对索引的赋值改变原始数组
ar[[3,4,5]]=10
print(ar)
ar[[3,4,5]]=[1,2,3]
print(ar)
ar=np.arange(6)
b=ar.copy()
b[:3]=10
print(b)#对经copy得到的b索引/切片赋值b[:3]=10时只改变b
print(ar)#改变copy得到数组,原数组ar并没有发生改变
'''
ar [0 1 2 3 4 5]
[ 0 1 2 99 99 5]
[ 0 1 2 10 10 10]
[0 1 2 1 2 3]
[10 10 10 3 4 5]
[0 1 2 3 4 5]
'''
数组遍历
一维数组用for可以得到里面元素
二维数组用for得到第一轴对应的元素,即每一行的元素,返回一个ndarray
二维数组用for element in d.flat遍历可以得到每一个元素
#一维数组的遍历
ar=np.arange(3)
for i in ar:
print(i**2)#输出每个元素的平方
# 多维数组遍历方法
d=np.random.randint(1,10,size=(2,2,3))
print(d)
print('方法1:直接整行打印')
for row in d:
print(row)
print('方法2:使用方法ar.flat遍历元素')
for element in d.flat:
print(element)
'''
0
1
4
[[[6 3 7]
[2 3 7]]
[[7 6 3]
[7 8 4]]]
方法1:直接整行打印
[[6 3 7]
[2 3 7]]
[[7 6 3]
[7 8 4]]
方法2:使用方法ar.flat遍历元素
6
3
7
2
3
7
7
6
3
7
8
4
'''