一、读取txt文件

import numpy

world_alcohol=numpy.genfromtxt("world_alcohol.txt",delimiter=",",dtype=str)
print(type(world_alcohol)) #class 'numpy.ndarray'
print(world_alcohol)       #将其视为矩阵一样的东西
print(help(numpy.genfromtxt)) #获取帮助

二、构造数组 (核心)

1. 创建数组

#构造数组 numpy.array()
a_vector=numpy.array([1,2,3]) # 构造一维数组,输入一个list
a_matrix=numpy.array([[1,1,1],[2,2,2],[3,3,3]]) #二维矩阵,list嵌套list,三维也是如此
print(a_vector)
print(a_matrix)

# 数组大小,shape
print(a_vector.shape) #output: (3,)写成元组的格式
print(a_matrix.shape) #output: (3, 3)

a_vector=numpy.array([1,2,3]) # 构造一维数组,输入一个list
a_matrix=numpy.array([[1,1,1],[2,2,2],[3,3,3]]) #二维矩阵,list嵌套list,三维也是如此
print(a_vector)
print(a_matrix)

# 数组大小,shape
print(a_vector.shape) #output: (3,)写成元组的格式
print(a_matrix.shape) #output: (3, 3)

  注意:用numpy.array()生成的数组,内部的元素都是同一种类型的,如果传入的元素不是同一种类型,会发生强制类型转换

#构造数组的结果:元素都是同一种类型
vector1=numpy.array([1,2,3]) # 构造一维数组,输入一个list
print(vector1) #[1 2 3]
print(vector1.dtype) #int32

vector2=numpy.array([1,'2',3]) # 构造一维数组,输入一个list
print(vector2) #['1' '2' '3']
print(vector2.dtype) #<U11

2. 访问数组——采用索引的方式

# 基本的读取、显示txt中的数据
world_alcohol=numpy.genfromtxt("world_alcohol.txt",delimiter=",",dtype=str)
print(world_alcohol)       #print
print(world_alcohol[1][1]) #索引[1][1],即第二行、第列的元素
print(world_alcohol[1,1]) #索引[1][1],即第二行、第列的元素

3. 切片

# 矩阵切片
a_matrix=numpy.array([[1,1,1],[2,2,2],[3,3,3]]) #二维矩阵,list嵌套list,三维也是如此
print(a_matrix)
print(a_matrix[1,:]) #[2 2 2],打印出第二行所有列的元素
print(a_matrix[0:2,0:2])
print(a_matrix[:,0:2])

4. 运算

|-判断是否存在某个值

#运算-判断
vector2=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
print(vector2==3) 
#结果
# [[False False  True]
#  [False False False]
#  [False False False]]
print(vector2[vector2==3]) #将布尔类型当做一个索引,返回这个索引位置的值[3]

|-与或

#运算-与或操作
vector2=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
print((vector2==3)|(vector2==4))
print((vector2>3)&(vector2<6))
print(numpy.argwhere(vector2==1)) #[[0 0]]返回了1所在位置的坐标

5. 矩阵元素类型转换

# 改变类型
vector2=numpy.array([1,2,3])
print(vector2.dtype) #int32
vector3=vector2.astype(str)
print(vector3) #['1' '2' '3']
print(vector3.dtype)#<U11

6. 最小、最大值

# 最大最小值
vector2=numpy.array([1,2,3])
print(vector2.min())
print(vector2.max())

7. 求和(指定维度)

# 求和
vector2=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
print(vector2)
print(vector2.sum(axis=0))#按列求和[12 15 18]
print(vector2.sum(axis=1))#按行求和[ 6 15 24]

三、numpy常用函数

1. 通过arange构造函数、reshape重新设定矩阵的大小

a=np.arange(15)
print(a) #[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
print(a.reshape(3,5))
#[[ 0  1  2  3  4]
 # [ 5  6  7  8  9]
 # [10 11 12 13 14]]

print(a.ndim)#维数:1
print(a.size)#元素个数:15

2. 构造0矩阵、全1矩阵、

b=np.zeros((3,3))
print(b)
c=np.ones((1,4))
print(c)

3. arange、random、linspace

d=np.arange(1,10,2)# 从1到10(不包括10),步长为2
print(d) #[1 3 5 7 9]

e=np.random.random((3,4))
print(e)

from numpy import pi
f=np.linspace(0, 2*pi,100)
print(f)

4. 数值运算+-*/……

a=np.array([6,7,8,9])
b=np.arange(4)
print(a)
print(b)
print(a-b)
print(a+b)
print('---------')

c=np.array([[1,0],[0,2]])#注意,中括号容易遗漏
d=np.array([[1,2],[3,4]])
print(c)
print(d)
print('* 对应位置相乘:'+str(c*d)) #明明这个对应位置相乘,就是矩阵中的点乘呀
print('普通矩阵相乘:'+str(c.dot(d))) #结果是普通相乘的结果,但是这个符号形式看起来是点乘,奇怪
print('或者:'+str(np.dot(c,d)))

5. 其他

# 其他操作
b=np.arange(4) #[0 1 2 3]
print(b)
print(np.exp(b))  #[ 1.          2.71828183  7.3890561  20.08553692]
print(np.sqrt(b)) #[0.         1.         1.41421356 1.73205081]

四、矩阵常用操作

1. 向下取整、矩阵-向量转换、矩阵大小改变、求转置

#改变矩阵大小
a=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(a.ravel())    #变成一维的
# print(np.ravel(a))#这两种方式都可以

print(a.reshape(2,6)) #改变大小-方式1
a.shape=(2,6)    #改变大小-方式2
print(a)
print(a.reshape(4,-1)) #改变大小-方式3,只指定行/列数中的一个,剩下的用-1代替

print(a.T) #转置

2. 矩阵拼接(按行/列)

# 矩阵拼接
a=np.arange(4).reshape(2,2)
b=np.arange(4).reshape(2,2)
print(a)
print(b)
print(np.hstack((a,b))) #横着拼,注意括号的数目
print(np.vstack((a,b))) #纵着拼

3. 矩阵切分

# 矩阵切分
a=np.arange(18).reshape(3,6)
print(a)

print('--刀片纵向--')
print(np.hsplit(a,3))

print('--刀片横向--')
print(np.vsplit(a,3))

print('--指定刀口位置--')
print(np.hsplit(a,(2,3)))  #分别在第二、三个元素后切割

五、不同复制操作对比

# 不同复制语句之间的对比
# 1-等于号复制:指向的存储位置是一样的(id相同),改变其中一个,就会改变其他的
a=np.arange(2,25,2).reshape(3,4)
b=a
print(b is a) #True
print(id(a)) #42522544
print(id(b)) #42522544
b.shape=(2,6)
print(a.shape) #(2, 6)

print('----------')
# np.view()浅复制: id不同,但两个id使用公共的数据,所以改变其中一个,另一个也会受到影响
c=a.view()
print(c is a) #False
print(id(a)) #42522544
print(id(c)) #42522544
c.shape=(1,12)
c[0][0]=6666
print(a) #大小(2,6),a[0,0]=6666
print(c) #大小(1,12),c[0,0]=6666

print('----------')
# np.copy深复制:id 不同,存储位置不同,两个互不影响
d=a.copy()
print(d is a) #False
print(id(a)) #42522544
print(id(d)) #42609680
d.shape=(12,1)
print(a.shape) #(2, 6)
d[0][0]=888
print(a) #大小(2, 6) ,a[0,0]=6666
print(d) #大小(12, 1) ,d[0,0]=888

 

六、排序、索引

# 取得最大值并返回最大值的索引
data=np.sin(np.arange(20)).reshape(5,4)
print(data)
ind=data.argmax(axis=0) #按列取出每列的最大值所在行的索引
print(ind) #[2 0 3 1]
datamax=data[ind,range(data.shape[1])] #引用,分别是所在行,所在列,相当于data[(2,0,3,1),(0,1,2,3)]
print(datamax)
print(range(data.shape[1]))

2. np.tile() 扩展

# 2. np.tile() 扩展
a=np.arange(0,40,10)
print(a)
b=np.tile(a,(3,2)) #扩展成:3行,2列
print(b)

3. np.sort() 排序

# 3. np.sort() 排序
a=np.array([[4,5,3],[1,2,1]])
print(a)
b=np.sort(a,axis=1) #每行,按小-大排序
print(b)

a.sort(axis=1)
print(a) #每行,按小-大排序

c=np.array([2,1,4,3])
j=np.argsort(c) #返回,c中小-大的索引值
print(j) #[1 0 3 2]
print(c[j])  #[1 2 3 4]