Numpy 学习总结

目录

一、数组

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

1、特殊数组

    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行列数为某值的单位矩阵,斜角对称

2、创建数组

常用方法:

np.array()创建数组

np.random模块来创建数组

np.arange()来创建区间数组

np的特殊函数来创建特定数组

3、修改数组元素类型

类型 说明
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')

4、数组基本属性查看

属性函数 说明
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

5、改变数组维度

df.reshape((3,4))  # 3行4列 
df.reshape((12,))  # size=12的一维数组  

扁平化操作

df.flatten()  # 返回数组
df.flat  # 返回可迭代对象
df.ravel()  # 返回视图,修改视图时会同时修改原数组的值

reshape()、flatten()、flat不会修改原来的数组,只是将结果返回。

6、索引与切片

一维数组切片与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)]

返回的是一维数组

7、元素替换

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

8、数组变形

函数 说明
.reshape() 不会修改原数组,只会对其进行拷贝后输出
.resize() 会对原数组直接进行修改,不会返回值

9、数组拼接

垂直拼接:

需要列数一致

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) 先进行叠加再转换成一维数组。

10、数组切割

水平切割:

    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按列进行切割

11、数组的数学计算

ndarray.dot(ndarray2) 矩阵相乘
ndarray.transpose() 转置矩阵,与.T不同的是,它的返回值为一个视图,修改视图会同时影响原数组

二、其他相关操作

1、存储文件

存储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维以上的数组。

2、缺失值处理

    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]]

3、随机数

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])数组会被打乱

4、axis的理解

举例:[[[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层,可以操作该层下的直系子元素。

5、一元函数

函数 描述
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 反三角函数

6、二元函数

函数 描述
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 或 |

7、聚合函数

函数 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自带的函数。

8、布尔判断函数

函数 描述
np.any(条件)或(条件).any() 验证如何一个元素是否为真 |
np.all(条件)或(条件).all() 验证所有元素是否为真 &

9、排序

函数 描述
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从数组中取出指定下标的元素序号

10、其他函数补充

函数 描述
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']

你可能感兴趣的:(python,数据挖掘,机器学习,矩阵,深度学习,python,数据挖掘,数据分析)