它们都是拆分多维数组变一维的
In [3]: arr = np.asarray([[1,2],[3,4]])
In [4]: arr
Out[4]:
array([[1, 2],
[3, 4]])
In [5]: m = arr.flatten()
In [6]: m
Out[6]: array([1, 2, 3, 4])
In [7]: n = arr.ravel()
In [8]: n
Out[8]: array([1, 2, 3, 4])
两者的区别在于
由ravel拆分的数组n改变会影响原来的值,而flatten改变不会影响原值
In [10]: n[1] = 10
In [11]: arr
Out[11]:
array([[ 1, 10],
[ 3, 4]])
In [12]: m[1] = 12
In [13]: arr
Out[13]:
array([[ 1, 10],
[ 3, 4]])
In [15]: np.c_[m,n]
Out[15]:
array([[ 1, 1],
[12, 10],
[ 3, 3],
[ 4, 4]]
对于上面的m,n拼接起来就是这个
5.np.log(x) 等于数学表达式logx
6.np.isnan(x) 判断x是否为一个数字,比较奇怪的是,如果是数字它返回False,否则返回Ture,并且不支持字符之类的,能被判True我目前只知道float(inf) 正无穷 -float(inf)负无穷 float(nan)
7.np.dot
arr1 = np.asarray([1,2,3,4,5,6])
arr2 = np.asarray([1,2,3,4,5,6])
print(np.dot(arr1,arr2))
print(arr1.dot(arr2))
print(arr1.T.dot(arr2))
这三种调用方式都是一样的得到91,也就是两个向量的内积
特别注意下,如果是用mat生成的矩阵,是无法用这个的,即使用第三种成功了,也只是个6阶矩阵而不是内积
8.[:, x]说说这个语法这个是取矩阵的第x列
[:, x:y]则是取x-y列,闭合区间是[x,y)比如下面这个数组是2是无法取到3,4,8的
import numpy as np
arr = np.asarray([[1,2,3],[2,3,4],[6,7,8]])
print(arr[:,1])
print(arr[:,0])
print(arr[:,2])
[2 3 7]
[3 4 8]
结果如上
9.np.linspace(start,end,count,startpoint,endpoint,dtype)count 默认为50, 设置起始值,会生成一个等比的数据为50,范围在start-end的数组,后面startpoint,endpoint的是bool值,包不包含起始点.dtype为数据类型比如
arr , gap = np.linspace(10,20,50,True,True,float)
print(arr)
print(gap)
[10. 10.20408163 10.40816327 10.6122449 10.81632653 11.02040816
0.20408163265306123
gap为步长,就是两个数之间的差距,如果只传start和end是不会生成步长的
10.np.meshgrid这个函数我目前理解的也不是特别深,只知道它可以根据2个一维数组生成一个3维数组,注意不是3阶是三维
格式2*len(arr1)*len(arr2)这种格式,后期深入了再来补充
11..np.arange(x)生成一个0-(x-1)的一维数组
12.np.random.random((x,y)) 生成一个x*y阶的数组
13.print(arr1.dtype) 打印出arr1的数据类型
14.arr1.astype(np.float64)进行类型强转输出来不是之前的int,而是变成了float
15.arr2[np.arange(4),b] += 10 切片元素+10
16.na = arr2 > 0.5 把arr2根据里面的值转成bool矩阵,其中大于0.5为true,小于或等于为false,
然后用这个矩阵na做下标s_arr = arr2[na],这样得出来的s_arr就是会取出所有符合>0.5的元素,
如果嫌麻烦arr2[[arr2 > 0.5]]这也可以实现
matrix_a = np.array([[1,2],[3,4]],dtype=int)
matrix_b = np.array([[5,6],[7,8]],dtype=float)
hybird = matrix_a + matrix_b print(hybird) print(np.add(matrix_a,matrix_b)) #点对点相加,所以必须是相同阶的数组
hybird = matrix_a - matrix_b
print(hybird)
print(np.add(matrix_a,matrix_b)) #减 点对点相减,所以必须是相同阶的数组
hybird = matrix_a * matrix_b
print(hybird)
print(np.multiply(matrix_a,matrix_b)) #乘
hybird = matrix_a / matrix_b
print(hybird)
print(np.divide(matrix_a,matrix_b)) #除
print(np.sqrt(matrix_a)) #对a所有元素开根号
arr = np.arange(20)
print(arr.reshape((2,5,2))) #把一个一维数组改成3维,但改变后的数据和改变之前的数据必须是一样的,比如2,3,2这种数组就需要12个元素
arr = np.arange(20)
arr = arr.reshape((2,5,2))
print(arr)
print(">>>>>>>>>>>>>>>>>>>>",arr.transpose((1,0,2))) #把之前的纬度进行改变,改变之后变成5,2,2,比如对二维矩阵而言5*2改变成1,0就会变成2*5阶
arr = np.arange(30)
arr = arr.reshape((2,5,3))
print(arr.transpose((2,1,0)))
print(">>>>>>>>>>>>>>>>>>>>",arr.swapaxes(0,2)) #swapaxes和transpose的效果类似,不同的是,swapaxes是指定的列交换,而transpose需要传入所有列,用数字排序
arr = np.arange(12).reshape((-1,3))
print(arr)
print(sum(arr)) #可见python原生的sum只会把列相加生成一个一维数组
print(arr.sum()) #而np的sum会把所有元素相加,
print(np.sum(arr)) #生成一个整形,arr.sum()和np.sum(arr)是一样的,
print(np.sum(arr,axis = 0)) #axis = 0 则列相加,和python原生sum是一样的效果,1为行相加
arr = np.arange(12).reshape((-1,3))
print(np.mean(arr))
print(np.mean(arr,axis=0))
print(np.mean(arr,axis=1)) #首先mean是求平均数,axis0和1分别是求列平均数和行平均数
arr = np.arange(12).reshape((-1,3))
print(np.cumsum(arr)) #生成一个相加的数组,后面的数为前面数之和
print(np.cumsum(arr,axis=0)) #列相加新数为数上面一个数加原本这个位置的数,然后生成的新数
print(np.cumsum(arr,axis=1)) #行相加,逻辑与上面一样
arr = np.arange(12).reshape((-1,3))
print(np.cumprod(arr)) #生成一个相乘的数组,后面的数为前面数相乘的结果
print(np.cumprod(arr,axis=0)) #列相乘新数为数上面一个数乘原本这个位置的数
print(np.cumprod(arr,axis=1)) #行相乘新数为数上面一个数乘原本这个位置的数
arr = (np.random.randn(10) * 10)
arr.sort()
print(arr) #生成一个排序好的数组
arr = (np.random.randn(3,4) * 10)
arr.sort(0) #对于多维数组0为列排序,1为行排序
print(arr)
arr = np.arange(20).reshape((4,5))
print(np.zeros_like(arr)) #生成一个和arr同阶的相似矩阵
mat_a = np.arange(0,5)
mat_b = np.arange(5,10)
b_arr = [True,False,True,False,True]
print(np.where(b_arr,mat_a,mat_b)) #where这个函数会根据True,False分别从mat_a和mat_b中取值,所以它们需要是同维同阶的
arr = np.random.randn(4,3)
n_a = np.where(arr > 0 , 1 , -1)
print(n_a) #根据where的特性,可以使原来的连续矩阵转成二项分布
arr1 = np.arange(9).reshape((-1,3))
arr2 = np.arange(9,18).reshape((-1,3))
hybird_arr = np.concatenate((arr1,arr2),axis=0)
print(hybird_arr) #合并成一个数组比如2*2 +2*2如果是行合并就变成4*2,如果列合并就变成2*4,合成的列或者行必须相等,否则报错
arr1 = np.arange(9).reshape((-1,3))
arr2 = np.arange(9,18).reshape((-1,3))
# hybird_arr = np.vstack((arr1,arr2)) #veritical 垂直合并也就是上下合并,也就是行合并
hybird_arr = np.hstack((arr1,arr2)) #horizontal 水平合并,也就是列合并
print(hybird_arr)
arr = np.arange(36).reshape((6,6))
print(arr)
one,two,three = np.split(arr,[1,3],axis=1) #老规矩axis可以为0页可以为1,0是行分割,割掉的部分给two,之前的给one,后面的给three
print(one)
print(two)
print(three)
arr = np.arange(3)
print(arr.repeat(3)) #延长三倍注意不是123形式比如arr是[0,1,2]生成的是[0,0,0,1,1,1,2,2,2]
print(arr.repeat((2,3,4))) #也可以按元素个数填需要的倍数 ,比如arr是[0,1,2]生成的是[0,0,1,1,1,2,2,2,2]
arr = np.arange(6).reshape((2,3))
print(arr.repeat(3,axis = 0))
print(arr.repeat((2,3),axis = 0)) #对于多维数组repeat则需要加axis了,老规矩0是行,1是列[[0 1 2]
[0 1 2]
[0 1 2]
[3 4 5]
[3 4 5]
[3 4 5]]
[[0 1 2]
[0 1 2]
[3 4 5]
[3 4 5]
[3 4 5]]
arr = np.random.rand(2,2)
print(np.tile(arr,2)) #水平方向扩张一份变成2倍
print(np.tile(arr,(2,3))) #垂直方向变成2倍,水平方向变成3倍
arr = np.loadtxt("test1.txt",delimiter = ',') #读取一个当前文件夹下的一个叫test1.txt的文本,
print(arr) #注意一定得是这个.py文件同文件夹下的,同时必须有test1.txt这个文件,delimiter表示文本里面数据的分割方式
arr = np.random.rand(10000,7) *10000
np.savetxt('sth.txt',arr,delimiter='-') #将一个二维数组写入txt