Numpy 学习总结

22 篇文章 4 订阅
14 篇文章 1 订阅

目录

一、数组

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.sumnp.nansum计算元素的和
np.prodnp.nanprod计算元素的积
np.meannp.nanmean计算元素的平均值
np.stdnp.nanstd计算元素的标准差
np.varnp.nanvar计算元素的方差
np.minnp.nanmin计算元素的最小值
np.maxnp.nanmax计算元素的最大值
np.argmaxnp.nanargmax找出最大值的索引
np.argminnp.nanargmin找出最小值的索引
np.mediannp.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']
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值