# 数组属性
# 查看类型
print(type(a)) # numpy.ndarray
# 查看数组中的数组类型
print(a.dtype) # int32
# 查看形状 会返回一个元组,每个原杀杀杀代表这一维的元素数目
print(a.shape)   # (10,)
print(np.shape(a))   # (10,)
# 查看数组的元素数目
print(a.size) # 10
print(np.size(a)) # 10
# 查看数组的维度
print(a.ndim) # 1
print(np.ndim(a)) # 1
# 索引与切片
# 索引第一个元素
a = np.array([0,1,2,3])
print((a[0]))  # 0
# 修改第一个元素的值
a[0] = 10 # array([10,2,3,4])
# 切片:与列表相同,支持负索引,同样有步长
# 多维数组及其属性
a = np.array([[0,1,2,3],[10,11,12,13]])  # 事实上我们传入的是一个以列表为元素的列表,最终得到一个二维数组
print(a.shape) # (2,4) 两行四列
print(a.size) # 8
print(a.ndim) # 2  二维
# 多维数组索引和切片
a[1,3]  # 对于二维数组,可以传入两个数字来索引,分别对应行和列
a[1] = 3 # 将第二行元素全部改为零(易错) [3,3,3,3]
a[0,2] = 1 # 将第一行第三列改为一
a[:,1] # 第二列元素
a[-2:,-2:] # 后两行后两列的元素
# 切片里两个两个数值可以通过切片的方式表示行和列
'''切片是引用,切片在内存中使用的是引用机制,引用机制意味着,python并没有为切片内容分配新的空间来存储它的值,而是让他指向数组所分配的内存空间,
因此改变切片的值也会改变原数组的值,而这种现象在列表中不会出现.这样的好处在于,对于很大的数组,不用大量复制多余的值,节约了空间。缺点在于,可能出现改变一个值改变另一个值的情
况。解决方法是使用copy()产生一个复制,这个复制会申请新的内存'''
a = np.array([1,2,3,4])
b = a[2:4]  # [2,3]
b[0] = 10 # 此时的a 为[10,2,3,4]
# 花式索引
# 一维
a = np.arange(0,100,10)
index = [1,2,-3]
y = a[index]
print(y) # [10 20 70] 分别为对应索引的元素

# 使用布尔数组来花式索引
mask = np.array([0,1,2,0,3,0,3,0,1],dtype=bool)
a = np.array([1,2,3,4,5,6,7,8,9])  # a和mask必须长度必须相等
print(a[mask])  # [2 3 5 7 9]

# 二维花式序列
a = np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
'''[[ 0  1  2  3  4  5]
    [10 11 12 13 14 15]
    [20 21 22 23 24 25]
    [30 31 32 33 34 35]
    [40 41 42 43 44 45]
    [50 51 52 53 54 55]]'''
# 返回次对角线上的5个值
a[(0,1,2,3,4),(1,2,3,4,5)]  # array([1,12,23,34,45])
a[-3:,(1,2,3)] # 后三排的2,3,4列
'''array([[31, 32, 33],
          [41, 42, 43],
          [51, 52, 53]])'''
# 使用mask进行索引
mask =np.array([1,0,1,0,0,1],dtype=bool)
a[mask,2]  # array([ 2, 22, 52]) 第三列的元素与mask花式索引

# 注意花式索引与切片不同,花式索引返回的是原对象的一个复制而不是引用
# 不完全所引
a[:3]  # 只给定行所引得时候,返回整行
# 可以使用花式索引引出第2,3,5行
con = np.array([0,1,1,0,1,0],dtype=bool)
a[con]
'''array([[10, 11, 12, 13, 14, 15],
          [20, 21, 22, 23, 24, 25],
          [40, 41, 42, 43, 44, 45]])'''