# coding=utf-8

from numpy import *

# 估计 + - / > < 等布尔运算符 也和 * 是一样的规则
def mulTest():
    a = array([[1,2,3],[2,3,4],[4,5,6]])
    v = array([1, 2, 4])
    m = mat(a)

    # 凡是和mat相乘都会使用矩阵乘法
    print m * m     # mat * mat 矩阵乘法
    print v * m     # array1 * mat 矩阵向量乘法，array1是行向量
    print m * a     # mat * array2 矩阵乘法

    # 两方都是 array会使用对应相乘
    print a * a     # array2 * array2 对应相乘
    print v * v     # array1 * array1 对应相乘
    print a * v     # array2 * array1 对应相乘，array2的每个子数组array1对应相乘array1

    print type(eye(3))

    # array_m * array_n => shape(a_m,am_1..a_1) 与 shape(b_n,b_n-1,..b_1) 的array相乘的条件是
    # a_i == b_i 或 a_i == 1 或 b_i == 1, 如果a_i==1 乘法效果相当于将array内容重复复制到a_i==b_i是乘法的效果比如下面例子：
    #   array3 * array([v]) == array3 * array([v,v,v])
    # 效果就是低层（内层数组） 对应相称
    array3 = array([a, a])
    # (shape=(2, 3, 3) * shape=(1, 3)) == (shape=(2,3,3) * shape=(3,3))
    print (array3 * array([v]) == array3 * array([v, v, v])).all()
    print array3 * array([v])

def indexesTest():
    a = array([[1,2,3],
               [2,3,4]])
    boola = a >= 3                  # boola
    print boola
    indexes = nonzero(boola)        # 选出非零项或True项的下标，这里就是 >= 3的数字的下标

    print "the indexes of item which >= 3 is:"
    for i in range(len(indexes[0])):
        print " ",indexes[0][i],indexes[1][i]
    a[indexes] = 0                  # 将这些项置为零
    print a

# tile 很适合用在求 一个向量要和很多向量做相同的运算，用tile拓展该向量，在用矩阵运算,参考KNN
def tileTest():
    # A.shpae = (a_n, .. ,a_2, a_1) ; reps = (r_m, .., r_2, r_1)
    # tile(A, reps).shape = (a_n, .. , a_m * r_m, .. , a_2 * r_2, a_1 * r_1)   if n > m
    # tile(A, reps).shape = (r_m, .. , a_n * r_n, .. , a_2 * r_2, a_1 * r_1    if n < m
    # 扩充的方式 是 复制
    print tile(1, 3)                # [1 1 1]
    print tile([1], (3))            # [1 1 1]
    print tile([1, 2, 3], (2,3))    # [[1 2 3 1 2 3 1 2 3] , [1 2 3 1 2 3 1 2 3]]
    print tile([[1, 2, 3]], (2,3))  # [[1 2 3 1 2 3 1 2 3] , [1 2 3 1 2 3 1 2 3]]

def sumTest():
    # array.sum默认是求整个数组的和
    # array.shape = (a_0, a_1, .., a_i, .. a_n)
    # array.sum(axi=i) 的结果是 array的 array.shape = (a_0, a_1, .., 1, .. a_n)
    # array[b_0][b_1]..[a_i-1] + ..+ array[b_0][b_1]..[0] for b_i in range(a_i)

    # 对于二位数组，axis=0 是每列求和， axis=1是每行求和
    m = array([[[1,2,3],[2,3,4]]])
    for i in range(len(m.shape)):
        print m.sum(axis=i)
        print
    print m.sum()
#mulTest()
#tileTest()
sumTest()