'''
整数数组索引
    获取如（1，0） （0，0）等位置元素
'''

import numpy as np

x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0, 1, 2], [0, 1, 0]]
print(y)                                #获取二维数组中（0，0） （1，1） （2，0）的元素
print('\n')                                   #[1 4 5]


x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])
print ('我们的数组是：' )
print (x)
print ('\n')
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]                                        # 组合就是 [0,0] [3,3]
                                                        #           [0,2] [0,2] 即（0，0） （0，2） （3，0） （3，2）位置
                                                        #显示的是二维数组
print  ('这个数组的四个角元素是：')
print (y)
print('\n')


a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]         #行索引为1，2；列索引为1，2
c = a[1:3,[1,2]]         #行索引为1，2；列索引为1，2
d = a[...,1:]              #同行数 列索引为1-最后
print(b)
print(c)
print(d)
print('\n')

'''
我们可以通过一个布尔数组来索引目标数组。
布尔索引通过布尔运算（如：比较运算符）来获取符合指定条件的元素的数组。
'''

x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])
print ('我们的数组是：')
print (x)
print ('\n')
# 现在我们会打印出大于 5 的元素
print  ('大于 5 的元素是：')
print (x[x >  5])
print('\n')

# 使用了 ~（取补运算符）来过滤 NaN。
a = np.array([np.nan,  1,2,np.nan,3,4,5])
print (a[~np.isnan(a)])
print('\n')

# 从数组中过滤掉非复数元素。
a = np.array([1,  2+6j,  5,  3.5+5j])
print (a[np.iscomplex(a)])
print('\n')

'''
花式索引
花式索引指的是利用整数数组进行索引。
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。
对于使用一维整型数组作为索引，如果目标是一维数组，那么索引的结果就是对应位置的元素；
如果目标是二维数组，那么就是对应下标的行。
花式索引跟切片不一样，它总是将数据复制到新数组中。
'''

x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]]) #显示4 2 1 7 行
print('\n')

x=np.arange(32).reshape((8,4))
print (x[[-4,-2,-1,-7]]) #从后往前4 2 1 7 行
print('\n')

x=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])]) #显示1 5 7 2 行，按0 3 1 2的列的顺序
print('\n')