数组的基本运算
数组的形状和类型修改
-
np.reshape(a,newshape,order='C')
:原数组size不变的前提下,改变原数组的形状 -
np.resize(a,new_shape)
:改变原数组的形状和大小,与reshape
不同的是可以改变数组的size
。如果新数组大于原始数组,则新数组将填充a的重复副本。 - .T:将原shape为(n,m)的数组转置为(m,n),把数组的行和列进行互换,一维数组转置不变。
-
ndarray.astype(type)
:强制转换为指定的类型。
#1、reshape
import numpy as np
arr = np.random.randint(3,15,size=(3,2))
print(arr)
print('*'*30)
arr_1 = np.reshape(arr,(2,3))
print(arr_1)
[[ 6 6]
[ 7 12]
[ 8 7]]
******************************
[[ 6 6 7]
[12 8 7]]
#2、resize
import numpy as np
arr = np.random.randint(3,15,size=(3,2))
print(arr)
print('*'*30)
arr_1 = np.resize(arr,(3,3))
print(arr_1)
[[ 4 8]
[14 10]
[ 5 14]]
******************************
[[ 4 8 14]
[10 5 14]
[ 4 8 14]]
#3、转置
import numpy as np
arr = np.random.randint(3,15,size=(3,2))
print(arr)
print('*'*30)
arr_1 = arr.T
print(arr_1)
[[13 6]
[ 8 7]
[10 7]]
******************************
[[13 8 10]
[ 6 7 7]]
#4、astype强制转换为制定的类型
import numpy as np
arr = np.random.randint(3,15,size=(3,2))
print(arr.dtype)
print('*'*30)
arr_1 = arr.astype('float16')
print(arr_1.dtype)
#如果将浮点数转为整数,那么小数部分会被截断
n2 = np.random.uniform(1,5,size=(3,4))
print(n2)
print('*'*30)
print(n2.astype(np.int64))
int32
******************************
float16
[[2.13976361 4.81762022 4.10068156 2.34154714]
[2.86796845 4.5901374 1.55180308 2.23347534]
[3.63034111 4.92578335 4.87870914 3.25134124]]
******************************
[[2 4 4 2]
[2 4 1 2]
[3 4 4 3]]
Numpy数组合并,分割,元素重复
-
np.concatenate
合并 #默认axis=0 -
np.vstack
合并 #沿着轴0合并数组 -
np.hstack
合并 #沿着轴1合并数组 -
np.split
分割 -
np.array_split
:和split的区别是,可以不均等分割 -
np.hsplit
分割 沿着轴1 -
np.vsplit
分割 沿着轴0 -
repeat
:按照给定的次数,对数组的元素进行复制
#`合并` np.concatenate,np.vstack,np.hstack
import numpy as np
ar1 = np.arange(1,7).reshape(2,3)
print(ar1,end='\n**************\n')
ar2 = np.arange(8,14).reshape(2,3)
print(ar2,end='\n**************\n')
print(np.concatenate((ar1,ar2)),end='\n**************\n')#默认axis=0
print(np.concatenate((ar1,ar2),axis = 1),end='\n**************\n')#指定axis=1
print(np.vstack((ar1,ar2)),end='\n**************\n')
print(np.hstack((ar1,ar2)),end='\n**************\n')
[[1 2 3]
[4 5 6]]
**************
[[ 8 9 10]
[11 12 13]]
**************
[[ 1 2 3]
[ 4 5 6]
[ 8 9 10]
[11 12 13]]
**************
[[ 1 2 3 8 9 10]
[ 4 5 6 11 12 13]]
**************
[[ 1 2 3]
[ 4 5 6]
[ 8 9 10]
[11 12 13]]
**************
[[ 1 2 3 8 9 10]
[ 4 5 6 11 12 13]]
**************
#分割,split,hsplit,vsplit,array_split
import numpy as np
arry = np.arange(1,10).reshape(3,3)
print(arry,end='\n**************\n')
ar1 = np.split(arry,[1,3])
print(ar1,end='\n**************\n')
print(np.split(arry,3),end='\n**************\n')#5表示把数组分割成5组,只能是均等分割
print(np.array_split(arry,2),end='\n**************\n')#和split的区别是,可以不均等分割
print(np.hsplit(arry,[2,1]),end='\n**************\n')
print(np.vsplit(arry,[1,2]),end='\n**************\n')
[[1 2 3]
[4 5 6]
[7 8 9]]
**************
[array([[1, 2, 3]]), array([[4, 5, 6],
[7, 8, 9]]), array([], shape=(0, 3), dtype=int32)]
**************
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
**************
[array([[1, 2, 3],
[4, 5, 6]]), array([[7, 8, 9]])]
**************
[array([[1, 2],
[4, 5],
[7, 8]]), array([], shape=(3, 0), dtype=int32), array([[2, 3],
[5, 6],
[8, 9]])]
**************
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
**************
广播机制
广播
:广播描述了算法如何在不同形状的数组之间的运算。
1. 操作两个数组,先比较数组的shape:`a.维度相等,b.相对应的轴长度为1`
2. 所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
3. 输出数组的shape是输入数组shape的各个轴上的最大值
Numpy排序和唯一值
1. sort()
:排序,和python列表类型类似,Numpy数组可以使用sort
方法排序
import numpy as np
a = np.random.randint(30,size=(3,3))
print(a,end='\n***********\n')
a.sort(axis=0)
print(a)
[[ 9 7 18]
[11 27 11]
[20 11 8]]
***********
[[ 9 7 8]
[11 11 11]
[20 27 18]]
2. np.unique
:返回的是数组中唯一值排序后的数组
#去重,只取出唯一值,按照一维数组返回结果。
import numpy as np
a = np.random.randint(30,size=(3,3))
print(a)
print(np.unique(a))
[[16 7 29]
[ 4 12 28]
[10 9 6]]
[ 4 6 7 9 10 12 16 28 29]
3. np.in1d
:检查一个数组中的值是否在另外一个数组中,并返回一个布尔数组.
import numpy as np
a = np.random.randint(30,size=(2,2))
b = np.random.randint(30,size=(2,2))
print(a,b,end='\n***********\n')
print(np.in1d(a,b))
[[17 21]
[ 4 14]]
***********
[[ 6 14]
[ 6 5]]
[False False False True]
Numpy数学统计运算
基础数组统计方法(axis=0 按列,axis=1,按行)
方法 | 描述 |
sum | 总和 |
mean | 平均数 |
std | 标准差 |
var | 方差 |
min | 最小值 |
max | 最大值 |
argmin | 最小值的位置 |
argmax | 最大值的位置 |
import numpy as np
arr2 = np.random.randint(1,8,size=(4,3))
print(arr2,end='\n***********\n')
print('求和(按列):',arr2.sum(axis=0)) #axis=0 按列求和,axis=1,按行求和
print('求和(按行):',arr2.sum(axis=1))
print('求平均(按列):',arr2.mean(axis=0))
print('求平均(按行):',arr2.mean(axis=1))
print('求标准差(按列):',arr2.std(axis=0))
print('求标准差(按列):',arr2.std(axis=1))
print('求最小值(按行):',arr2.min(axis=0))
print('求最小值(按列):',arr2.min(axis=1))
print('求最大值(按行):',arr2.max(axis=0))
print('求最大值(按列):',arr2.max(axis=1))
[[4 6 7]
[4 2 2]
[1 3 6]
[2 1 7]]
***********
求和(按列): [11 12 22]
求和(按行): [17 8 10 10]
求平均(按列): [2.75 3. 5.5 ]
求平均(按行): [5.66666667 2.66666667 3.33333333 3.33333333]
求标准差(按列): [1.29903811 1.87082869 2.06155281]
求标准差(按列): [1.24721913 0.94280904 2.05480467 2.62466929]
求最小值(按行): [1 1 2]
求最小值(按列): [4 2 1 1]
求最大值(按行): [4 6 7]
求最大值(按列): [7 4 6 7]
Numpy逻辑操作和np.where
1. 逻辑运算
1. 比较运算符 >, >=, <, <=, ==, !=
,比较运算符,返回的是一个布尔数组。
import numpy as np
a = np.random.rand(3,3)
b = np.modf(a*30)[1]
print(b,end='\n***********\n') # 生成一个三行三列0-1的随机数*30,modf取出整数和小数部分,留整数部分
print(b<20)
[[17. 28. 4.]
[ 5. 27. 20.]
[28. 22. 13.]]
***********
[[ True False True]
[ True False False]
[False False True]]
2.1 逻辑运算符 与:&, 或:|, 非:~
2.2 二元通用函数与:logical_and, 或:logical_or, 非:lodical_not
import numpy as np
a = np.arange(1,10).reshape(3,3)
b = np.random.randint(5,10,size=(3,3))
print(a,b,end='\n***********\n',sep='\n***********\n')
print((a>5)&(b>5))
[[1 2 3]
[4 5 6]
[7 8 9]]
***********
[[5 8 5]
[5 6 7]
[9 7 7]]
***********
[[False False False]
[False False True]
[ True True True]]
2. np.where(condition, x, y)
:
是三元表达式 x if condition else y的向量化。如果是True,输出x,相反,False,输出y。传递给np.where的数组可以是同等大小的数组,也可以是标量。
np.where(arr1>0) #只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。
import numpy as np
a = np.arange(1,10).reshape(3,3)
print(a,end='\n***********\n',sep='\n***********\n')
print(np.where(a>5,11,0),end='\n***********\n')
print(np.where(a>5))
[[1 2 3]
[4 5 6]
[7 8 9]]
***********
[[ 0 0 0]
[ 0 0 11]
[11 11 11]]
***********
(array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))
3. any(),all()方法
:
函数名称 | 描述 |
np.any | 验证任何一个元素是否为真 |
np.all | 验证所有元素是否为真 |
这两个方法可以快速检查布尔数组,any()
:检查数组中是否至少有一个True, all()
:检查是否每个值都为True.
import numpy as np
a = np.arange(0,9).reshape(3,3)
print(a,end='\n***********\n',sep='\n***********\n')
#比如想看下数组中是不是所有元素都为0,那么可以通过以下代码来实现:
print(np.all(a==0))
#比如我们想要看数组中是否有等于0的数,那么可以通过以下代码来实现:
print(np.any(a==0))
[[0 1 2]
[3 4 5]
[6 7 8]]
***********
False
True