#基础索引

"""
一维数组的索引
1.可正可负  左开右闭  一正一负
2.和String的索引有点像
"""
np01 = np.arange(10)#[0,1,2,3,4,5,6,7,8,9]
print(np01[4])#索引是4的数据
print(np01[0:4])
print(np01[-7:-1])
print(np01[7:-1])
print(np01[0:4:2])
import numpy as np 
"""
二维数组的索引
1.语法  [行,列]
"""
np01 = np.arange(20).reshape(4,5)
print("源数组为")
print(np01)
print(np01[0,2])#第一行第三列的数据
print(np01[1,:])#第二行的所有列
print(np01[:,0])#所有行的第一列
print(np01[1:3,2:4])#行2到4行就是第2、3行,列第三列到第5列,就是第3、4列

"""
补充:通过索引进行修改数据
"""
np01[1,3] =100 #第2行第4列的数据修改为100
print("源数组为")
print(np01)

#高级索引

"""
一维数组的高级索引
直接那数组定义需要具体到那个数据
"""

np01 = np.arange(20)
print("源数组为")
print(np01)
np02 = np.array([1,3,8])
print(np02)
print(np01[np02]) #[1 3 8]
"""

二维数组的高级索引
可以通过列表的写法,具体到那个数据
1.语法:np01[数组,数组] 精确到行数,直接使用数组定义到行数和列数
2.语法:np01[[行],[列]],利用list精确到行数和列数
3.语法:np01[元组,索引],利用索引获取多个数值。#第一行和第四行,第第3列到第6列
4.语法:np01[数组,列表]  np01[列表,数组] 混合使用 
"""
np01 = np.arange(20).reshape(4,5)
print("源数组为")
print(np01)
np02 = np.array([1,3])#第二行和四行
print(np01[np02])
print(np01[np02,np02])#第二行和四行 第2列和第4列

np01 = np.arange(20).reshape(4,5)
print("源数组为")
print(np01)
print(np01[[0,1],[2,3]]) #(0,2)(1,2)位置的数据
#以上是获取单个数据,如果想要获取一个矩阵的怎么办
print(np01[(0,3),2:5]) #第一行和第四行,第第3列到第6列

np02 = np.array([1,3])#第二行和四行
print(np01[np02,[1,2]])#第二行和四行 第2列和第3列
print(np01[[1,2],np02])#第2行和3行 第2列和第4列

#布尔索引

布尔索引补更改原数组,创建的都是原数组的副本

#一维数组
import numpy as np
np01 = np.arange(20)
np02 = np01>10#拿到一个布尔数组,要是大于10就返回true要是小于10就返回false
print(np01)
print(np02)
#可以根据布尔获取矩阵中大于10的数据
np03 = np01[np02]
print(np03)
import numpy as np
np01 = np.arange(20).reshape(4,5)
print("源数组")
print(np01)
rows = [True,False,True,False] #相当于拿到第1、3行数据
np02 = np01[rows,:]
print(np02)
#拿到(0,2) (2,4) 第一行第3列,第3行第5列
cos = [False,False,True,False,True]
np03 = np01[rows,cos]
print(np03)
#(0,2)(0,3)(2,2)(2,3)
coss = np.array([False,False,True,True,False])
np04 = np01[np.ix_(rows,coss)]
np05 = np01[(0,2),2:4]
print(np04)
print(np05)

#np.ix_()

np.ix_()函数就是输入两个数组,产生笛卡尔积的映射关系

import numpy as np 
a = np.array([2, 3, 4, 5])
b = np.array([8, 5, 4])

ax, bx = np.ix_(a, b)

print("ax: ", ax)
print("bx: ", bx)


print("ax.shape: ", ax.shape)
print("bx.shape: ", bx.shape)

result = ax + bx 
print("ax + bx : ", result)
print("result[3, 2] ", result[3, 2])
"""
[
[2,2,2]
[3,3,3]
[4,4,4]
[5,5,5]
]
[
    [8, 5, 4],  
    [8, 5, 4]
    [8, 5, 4]
    [8, 5, 4]
]
"""

#根据索引获取最大数据

import numpy as np 

data = np.sin(np.arange(20))
data.shape = 5, 4
print("data: ", data)
#获取最大值数据的索引,每一列的最大数据的索引位置
ind = data.argmax(axis=0)  # 0代表列  1代表行
print("index: ", ind)
#data.shape[1] ==4 因为维度是(5,4
# 行是[2 0 3 1]   列是[0,1,2,3]  (2,0)以此类推
data_max = data[ind, range(data.shape[1])]
print("data_max: ", data_max)
print("data.max: ", data.max(axis=0))#求最大值
print(all(data_max == data.max(axis=0)))