#使用python列表创建数组
import numpy as np
a = np.array([1,2,3,4])
print(a)

#使用python列表创建数组
b = np.array([[1,2],[3,4],[5,6]])
print(b)

#查看数组的属性 维度,形状,数据类型
b.ndim 
b.shape
b.dtype

#使用Numpy 提供的函数创建数组
c = np.arange(10)
print(c)

# numpy.linspace(start, stop[, num=50[, endpoint=True[, retstep=False[, dtype=None]]]]])
# 返回在指定范围内的均匀间隔的数字(组成的数组),也即返回一个等差数列
# start - 起始点,
# stop - 结束点
# num - 元素个数,默认为50,
# endpoint - 是否包含stop数值,默认为True,包含stop值;若为False,则不包含stop值
# retstep - 返回值形式,默认为False,返回等差数列组,若为True,则返回结果(array([`samples`, `step`])),
# dtype - 返回结果的数据类型,默认无,若无,则参考输入数据类型。
d = np.linspace(0,2,11)
print(d)
np.ones((3,3))
np.ones((2,3,3))
np.zeros((3,6))
# # numpy.eye(N,M=None, k=0, dtype=<type 'float'>)
# # 关注第一个第三个参数就行了
# # 第一个参数:输出方阵(行数=列数)的规模,即行数或列数
# # 第三个参数:默认情况下输出的是对角线全“1”,其余全“0”的方阵,如果k为正整数,则在右上方第k条对角线全“1”其余全“0”,k为负整数则在左下方第k条对角线全“1”其余全“0”。
np.eye(4)
np.eye(4,4,-2)
np.random.randn(6,4)


#访问数组中的元素
a = np.arange(10)
#获取某个元素
a[::3]

#二维数组 (灵活的下标)
a = np.arange(0,51,10).reshape(6,1)+ np.arange(6)  #广播机制
print(a)
# a[0,0],a[2,-1]
# a[0,2:5]
# a[:3,:3]
# a[2,:]
# a[2]
# a[2,::]
# a[::2,::3]

a = np.random.randint(10,20,6)#[10,20)产生6个数值的随机数组
print(a)
b = (a % 2 == 0)
print(b)
c = a[a %2 ==0] #布尔数组作为索引
print(c)


#numpy自动转为行向量
a = np.arange(0,51,10).reshape(6,1)+ np.arange(6)  #广播机制
a[a % 2==0]


#numpy数组是共享的
a = np.arange(6)
b = a[2:5]
b[1] = 100
print(a,b)
print("a,b共享状态是:",np.may_share_memory(a,b))
#不想共享,复制吧
c = a[2:5].copy()
c[1] = 101
print (a,b, c)
print("a,c共享状态是:",np.may_share_memory(a,c))


#求质数
a = np.arange(1,101)   #.reshape(4,25)
n_max = int(np.sqrt(len(a))) #对a的长度开方,取整数
is_prime = np.ones(len(a),dtype = bool)
print(len(is_prime))
is_prime[0] = False


for i in range(2,n_max):
    print(i)
    for i in a[is_prime]:
        is_prime[(i**2-1)::i] = False
    #print(a[is_prime])
print(a[is_prime])


#求质数
a = np.arange(1,101)   #.reshape(4,25)
n_max = int(np.sqrt(len(a))) #对a的长度开方,取整数
is_prime = np.ones(len(a),dtype = bool)
print(len(is_prime))
is_prime[0] = False


for i in range(2,n_max):
    print(i)
    for i in a[is_prime]:
        is_prime[(i**2-1)::i] = False
    #print(a[is_prime])
print(a[is_prime])


#numpy 运算
a = np.arange(6) 
#与标量相加
print(a+5)
b = np.random.randint(1,5,20).reshape(4,5)
print(b,b*3) #与标量相乘


#numpy 运算
a  = np.random.randint(1,5,(5,4))
b = np.ones((5,4),dtype = int)
print(a,b,a+b,a*b) # 数组相加,相乘(逐个处理)

# 内积
a  = np.random.randint(1,5,(3,2))
b  = np.random.randint(1,5,(2,3))
print(a,b, np.dot(a,b))


#广播机制
a = np.random.randint(1,5,(5,4))
b = np.arange(4)  #1*4 ??np.arange(5)
print(a,b,a+b)

c = np.arange(5).reshape(5,1)
print(a,c,a+c)


# 数组直接比较
a = np.array([1,2,3,4])
b = np.array([1,2,3,4])#[4,2,2,4]
print(a==b)
print(a>=b)
print((a==b).all())#all 原始相等
print((a>=b).any())#纯在a>=b

#内置函数
a = np.arange(6)
print(a,np.cos(a),np.exp(a),np.sqrt(a),sep="\n")

#内置统计
a  = np.random.randint(1,5,6)
#a = np.array([3,4,3,4,3,4])
#求和,均值,方差,最小值,最大值,最小值索引,最大值索引,中位数
print(a,a.sum(),a.mean(),a.std(),a.min(),a.max(),a.argmin(),a.argmax(),np.median(a),sep="\n")

#众数
counts = np.bincount(a)#出现次数
print(counts)
#返回众数
print(np.argmax(counts))


#二维数组,根据行列计算
#axis表示坐标轴,0 :按行,1:按列
b = np.random.randint(1,5,(6,4))
print(b,b.sum(),b.sum(axis=0),b.sum(axis=1),b.sum(axis=1).sum(),sep="\n")
#
print("******")
print(b.max(axis=0),b.max(axis=1),b.argmin(axis=1),b.std(axis=1),sep="\n")

a = np.random.randint(0,101,(10,3))
print(a)
#求每个人的均值
print("a均值是:",a.mean())
print(a.mean(axis=1))
#每门成绩的均值
print(a.mean(axis=0))

import numpy as np
 
arr2 = np.arange(12).reshape(3,4)
print(arr2)
# 保存数据到txt文档(fmt:数据格式,delimiter:分隔符)
#np.savetxt(r"numpyData.txt", arr2, fmt="%d", delimiter=" ", newline="\r\n")
# 从txt文档中读取数据(dtype:数据格式)
values1 = np.loadtxt(r"numpyData.txt", delimiter=" ", 
         unpack=False,dtype=int)  # unpack=True将进行转置,否则不会。默认False r表示原始字符串
print(values1)
# # 从txt文档中读取数据(usecols表示我们需要获取的列)
values2 = np.loadtxt(r"numpyData.txt",delimiter=" ",usecols=(1,3),unpack=False)
print(values2)