目录
一、数组
1、特殊数组
2、创建数组
3、修改数组元素类型
4、数组基本属性查看
5、改变数组维度
6、索引与切片
7、元素替换
8、数组变形
9、数组拼接
10、数组切割
11、数组的数学计算
二、其他相关操作
1、存储文件
2、缺失值处理
3、随机数
4、axis的理解
5、一元函数
6、二元函数
7、聚合函数
8、布尔判断函数
9、排序
10、其他函数补充
import numpy as np
array_zeros = np.zeros((3, 3))
array_ones = np.ones((4, 4))
array_full = np.full((2, 3), 9)
array_eye = np.eye(4)
zero全零矩阵,
ones全1矩阵,
full(元组,数字)传入元组代表几行几列、数字代表都按该数字填充,
eye行列数为某值的单位矩阵,斜角对称
常用方法:
np.array()创建数组
np.random模块来创建数组
np.arange()来创建区间数组
np的特殊函数来创建特定数组
类型 | 说明 |
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
用astype()方法改变数据类型,如下几种方式所示(这种方法不会改变原数组的数据类型):
array_name.astype(int)
array_name.astype(np.int16)
array_name.astype('float64')
如果要改变原数组的数据类型,用以下方法:
array_name.dtype = np.uint8
创建时即指定类型:
df=np.array([[1,2,3],[4,5,6]], dtype='U')
属性函数 | 说明 |
ndarray.shape | 查看数组形状,几行几列,shape是一个元组,里面有几个元素代表几维数组 |
ndarray.ndim | 查看数组的维度 |
ndarray.size | 查看数组总共有多少个元素 |
ndarray.itemsize | 查看数组每个元素的大小,单位:字节。(1字节=8位) |
ndarray.flat | 可迭代的一维数组,通过循环遍历可访问每个元素 |
ndarray.T | 转置矩阵 |
ndarray.dtype | 数组字段类型 |
np.NAN或np.nan | 空值 |
np.INF获取np.inf | 无穷大 |
np.pi | 派 |
df.reshape((3,4)) # 3行4列
df.reshape((12,)) # size=12的一维数组
扁平化操作
df.flatten() # 返回数组
df.flat # 返回可迭代对象
df.ravel() # 返回视图,修改视图时会同时修改原数组的值
reshape()、flatten()、flat不会修改原来的数组,只是将结果返回。
一维数组切片与python原生切片类似,
二维数组有些不同:
arr2[2, 3] # 第2行第3列的元素
arr2[[1, 9], [3, 4]] # 获取元素为第1行第3列和第9行第4列的两个元素
arr2[[0, 2, 3]] # 获取第0行第2行第3行的元素
arr2[1:2, 4:5] # 获取第1行到第3行与第4列到第5行的数据,为闭区间
arr2[:, [1, 3]] # 获取第1列和第3列的数据
arr2[:, 1:3] # 获取第1列d到第3列的数据,为闭区间
bool索引
data[(data > 3) | (data < 12) & (data==10)]
返回的是一维数组
arr2[1]= np.array([1,2,3,4]) # 将第2行的数据替换为该数据
arr2[arr2 < 10]= 1 # 将arr2里小于10的元素替换为1
arr2= np.where(arr2 < 10 , 1, 0) #范围内的返回1,范围外的返回0
函数 | 说明 |
.reshape() | 不会修改原数组,只会对其进行拷贝后输出 |
.resize() | 会对原数组直接进行修改,不会返回值 |
垂直拼接:
需要列数一致
vstack1 = np.random.randint(0, 10, size=(3, 4))
vstack2 = np.random.randint(20, 50, size=(2, 4))
vstack3 = np.vstack([vstack1, vstack2])
# vstack3 = np.concatenate([vstack1, vstack2], axis=0)
print(vstack3)
[[ 3 0 2 7]
[ 6 3 4 5]
[ 0 6 1 9]
[34 41 46 42]
[36 44 43 31]]
水平拼接:
vstack1 = np.random.randint(0, 10, size=(3, 4))
vstack2 = np.random.randint(20, 50, size=(3, 2))
vstack3 = np.hstack([vstack2, vstack1])
# vstack3 = np.concatenate([vstack1, vstack2], axis=1)
print(vstack3)
[[32 31 9 5 3 0]
[42 22 0 2 9 3]
[44 22 8 6 0 8]]
属性 | 说明 |
vstack([arr1,arr2])或concatenate([arr1,arr2],axis=0) | 垂直拼接需要列一致 |
hstack([arr1,arr2])或concatenate([arr1,arr2],axis=1) | 水平拼接需要行一致 |
concatenate([arr1,arr2],axis=None) | 先进行叠加再转换成一维数组。 |
水平切割:
hs1 = np.random.randint(0, 10, size=(3, 4))
spl_arrs = np.hsplit(hs1, 2) # 切割数量,必须可被整除
spl2_arrs = np.hsplit(hs1, (1, 2)) # 对应索引前进行切割
# spl2_arrs = np.split(hs1,(1,2),axis=0)
print(spl_arrs)
print(spl2_arrs)
[array([[9, 4],
[7, 3],
[1, 4]]), array([[0, 1],
[9, 2],
[9, 9]])]
[array([[9],
[7],
[1]]), array([[4],
[3],
[4]]), array([[0, 1],
[9, 2],
[9, 9]])]
垂直切分:
hs1 = np.random.randint(0, 10, size=(4, 5))
spl_arrs = np.vsplit(hs1, 4)
spl2_arrs = np.vsplit(hs1, (1, 3))
# spl2_arrs = np.split(hs1,(1,3),axis=1)
print(spl_arrs)
print(spl2_arrs)
[array([[4, 5, 1, 1, 2]]), array([[1, 8, 4, 2, 1]]), array([[1, 4, 0, 7, 5]]), array([[2, 7, 9, 6, 5]])]
[array([[4, 5, 1, 1, 2]]), array([[1, 8, 4, 2, 1],[1, 4, 0, 7, 5]]), array([[2, 7, 9, 6, 5]])]
函数 | 说明 |
.vsplit() | 垂直切割 |
.hsplit() | 水平切割 |
.split()或array_split() | 手动指定轴进行切割,axis=0按行切割,axis=1按列进行切割 |
ndarray.dot(ndarray2) | 矩阵相乘 |
ndarray.transpose() | 转置矩阵,与.T不同的是,它的返回值为一个视图,修改视图会同时影响原数组 |
存储csv文件:
data = np.arange(12).reshape(3, 4)
np.savetxt("test.csv", data, delimiter=",", header="第一列,第二列,第三列,第四列", comments="", fmt="%d", encoding="utf-8")
读取csv数据:
data = np.loadtxt("test.csv", delimiter=",", skiprows=1, encoding="utf-8", dtype=np.str0)
print(data)
存储为npy文件:
data = np.random.randint(0, 10, size=(2, 3))
np.save("test3", data) # 存储为.npy文件,在数据统一时推荐使用
读取npy文件:
print(np.load("test3.npy"))
np.savetxt() | 一般用于写入csv文件,支持header属性,但只能操作一维和二维数组 |
np.loadtxt() | 一般用于读取csv文件,支持header属性,但只能操作一维和二维数组 |
np.save() | 一般用来存储非文本类型的文件,不可以设置header,但是可以存储3维以上的数组。 |
np.load() | 一般用来读取非文本类型的文件,不可以设置header,但是可以存储3维以上的数组。 |
data = np.random.randint(0, 10, size=(4, 3))
data.dtype = np.float32
data[1, 2] = np.NAN
data = data[~np.isnan(data)] # 直接转换会被变成一维数组
print(data)
[1.1e-44 1.4e-45 8.4e-45 8.4e-45 7.0e-45 1.3e-44 4.2e-45 9.8e-45 8.4e-45
5.6e-45 8.4e-45]
使用delete方法处理:
data = np.random.randint(0, 10, size=(4, 3))
data.dtype = np.float32
data[1, 2] = np.NAN
lines = np.where(np.isnan(data))[0]
data = np.delete(data, lines, axis=0) # 删除为空的行
print(data)
[[5.6e-45 8.4e-45 8.4e-45]
[0.0e+00 7.0e-45 1.3e-44]
[8.4e-45 0.0e+00 2.8e-45]]
使用条件赋值的方法:
data = np.random.randint(0, 10, size=(4, 3))
data.dtype = np.float32
data[0, 1] = 0.0
data[data == 0.0] = np.NAN
print(data)
[[1.e-44 nan 7.e-45]
[1.e-45 7.e-45 6.e-45]
[3.e-45 1.e-45 nan]
[1.e-45 1.e-44 6.e-45]]
np.random.seed(num) | num如何设置为固定那么随机数生成时也会固定 |
np.random.rand() | 生成0到1之间的随机数也可以传入参数表示几行几列,np.random.rand(3,4)产生3行4列的随机数 |
np.random.randn() | 产生标准正态分布的随机数 |
np.random.randint() | 指定区间的整型,如np.random.randint(0,10,size=(3,4))生成0到10之间3行4列是数组,size属性可不写默认为一个值 |
np.random.choice() | 使用时可传入一个数组,从数组里进行随机选择, 如:np.random.choice([1,2,3],size=(3,4)) 或np.random.choice(10,size=(3,4))表示从0到10里选取 |
np.random.shuffle() | 将数组进行洗牌,对数组直接进行操作。 如np.random.shuffle([0,1,2,3])数组会被打乱 |
举例:[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]
axis=0,代表从外而内第1层,可以操作该层下的直系子元素,这里对应操作[[1,2,3],[4,5,6]]和
[[7,8,9],[10,11,12]],运算时也会用这些子元素进行运算。
axis=1,代表从外而内第2层,可以操作该层下的直系子元素,这里对应操作[1,2,3],[4,5,6],[7,8,9],[10,11,12],运算时也会用这些子元素进行运算。
axis=2,代表从外而内第3层,可以操作该层下的直系子元素,这里对应操作1,2,3,4,5,6,7,8,9,10,11,12,运算时也会用这些子元素进行运算。
axis=n,代表从外而内第n+1层,可以操作该层下的直系子元素。
函数 | 描述 |
np.abs | 求绝对值 |
np.sqrt | 开根 |
np.square | 平方 |
np.exp | 计算指数(e^n) |
np.log,np.log10,np.log2,np.log1p | 求以e为底,以10为底,以2为底,以(1+x)为底的对数 |
np.sign | 将数组中的值标签化,大于0的变成1,等于0的变成0,小于0的变成-1 |
np.floor | 向下取整 |
np.ceil | 向上取整 |
np.round或np.rint | 四舍五入 |
np.modf | 将整数和小数分隔开来形成两个数的元组 |
np.isnan | 判断是否为nan |
np.isinf | 判断是否为inf |
np.cos,np.cosh,np.sin,np.sinh,np.tan,np.tanh | 三角函数 |
np.arccos,np.arcsin,np.arctan | 反三角函数 |
函数 | 描述 |
np.add | + |
np.sustract | - |
np.negative | 在数字前添加一个负号 |
np.multipy | 乘 * |
np.divide | 除 / |
np.floor_divide | 整除 // |
np.mod | 取余运算 % |
greater,greater_equal,less,less_equal,equal,not_equal | >,>=,<,<=,=,!= |
logical_and | 且 & |
logical_or | 或 | |
函数 | NAN安全版本 | 描述 |
np.sum | np.nansum | 计算元素的和 |
np.prod | np.nanprod | 计算元素的积 |
np.mean | np.nanmean | 计算元素的平均值 |
np.std | np.nanstd | 计算元素的标准差 |
np.var | np.nanvar | 计算元素的方差 |
np.min | np.nanmin | 计算元素的最小值 |
np.max | np.nanmax | 计算元素的最大值 |
np.argmax | np.nanargmax | 找出最大值的索引 |
np.argmin | np.nanargmin | 找出最小值的索引 |
np.median | np.nanmedian | 计算元素的中位数 |
numpy的内置函数效率远高于python自带的函数。
函数 | 描述 |
np.any(条件)或(条件).any() | 验证如何一个元素是否为真 | |
np.all(条件)或(条件).all() | 验证所有元素是否为真 & |
函数 | 描述 |
np.sort(arr,axis=0) | 默认为升序排,降序可以这样写:-np.sort(-arr,axis=0)。 |
arr.sort(axis=0) | 与第一个类似,但会影响到对应数组本身。 |
np.argsort(arr) | 返回排序后的下标值到对应数组位置。 实现降序也可以这样写: indexes=np.argsort(-arr) np.take(arr,indexes) #take从数组中取出指定下标的元素序号 |
函数 | 描述 |
np.apply_along_axis | 沿着某个轴执行指定的函数 |
np.linspace | 用来将指定区间内的值平均分成多少分,如图例为将 |
np.unique | 返回数组中的唯一值 |
np.apply_along_axis:
x = [[1, 2, 3], [4, 5, 6]]
print(np.apply_along_axis(lambda x: np.sum(x), axis=0, arr=x))
[5 7 9]
np.linespace:
print(np.linspace(1, 2, 12))
[1. 1.09090909 1.18181818 1.27272727 1.36363636 1.45454545
1.54545455 1.63636364 1.72727273 1.81818182 1.90909091 2. ]
np.unique:
print(np.unique(["ww", "yy", "yy", "x"]))
['ww' 'x' 'yy']