python numpy学习笔记

tech2022-08-28  107

ndarray数组对象的属性介绍

ndarray数组在numpy中简称array轴 axis: 保存数据的维度秩 rank: 轴的数量

以数组a为例:

import numpy as np a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) a array([[1, 2, 3, 4], [5, 6, 7, 8]])

a.ndim 返回秩 rank, 轴的数量

a.ndim 2

a.shape 返回(轴, 秩)元组

a.shape (2, 4)

a.size 返回轴与秩的乘积

a.size 8

a.dtype 返回数组的数据类型,int32 长度为32位二进制的整数类型

a.dtype dtype('int32')

a.itemsize 返回数组每一个元素的大小,以字节为单位

a.itemsize 4

创建ndarray数组的方法

通过np.array()传入列表、元组、列表元组混合, dtype不指定的话会自动匹配最佳的数据类型

a = np.array([[1,2,3],(4,5,6)], dtype=np.int) a array([[1, 2, 3], [4, 5, 6]])

通过np.arange(n),n是长度,下标是从0开始,类似于range()

a = np.arange(10) a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

生成一个全0的数组,形状是shape元组

a = np.zeros((3,4)) a array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])

生成一个全1的数组,形状是shape元组

a = np.ones((2,3)) a array([[1., 1., 1.], [1., 1., 1.]])

生成一个全3的数组,形状是shape元组,数值可自定义

a = np.full((2,3), 3) a array([[3, 3, 3], [3, 3, 3]])

生成一个5*5的正方形数组,对角线都是1,其余是0

a = np.eye(5) a array([[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.], [0., 0., 0., 1., 0.], [0., 0., 0., 0., 1.]])

传入一个ndarrary对象,会仿照对象的shape来生成一个形状一致的数组

b = np.ones_like(a) b array([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]) b = np.zeros_like(a) b array([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]]) b = np.full_like(a,3) b array([[3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.], [3., 3., 3., 3., 3.]])

给定范围生成数组 np.linspace(start, end, num, endpoint=False)

start: 起始值end: 结束值num: 想要生成多少子元素endpoint: 是否包含结束值 a = np.linspace(1, 10, 4, endpoint=False) a array([1. , 3.25, 5.5 , 7.75]) b = np.linspace(1, 10, 4) b array([ 1., 4., 7., 10.])

将两个数组合并

c = np.concatenate((a,b)) c array([ 1. , 3.25, 5.5 , 7.75, 1. , 4. , 7. , 10. ])

ndarray数组的维度变换

a = np.arange(10) shape = (2,5) a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

不改变a原来的数组,返回一个通过shape改变后的副本

b = a.reshape(shape) b array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])

resize与reshape一致,但会直接改变a数组

a.resize(shape) a array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])

不改变原来的数组a,返回一个折叠成一维的数组副本

b = a.flatten() b array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

将数组n个维度中两个维度进行调换

a.swapaxes(axis1,axis2)

ndarray数组的类型变换

a = np.arange(10).reshape((2,5)) a array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])

不改变原数组a,返回一个改变数据类型的副本

b = a.astype(dtype=np.float) b array([[0., 1., 2., 3., 4.], [5., 6., 7., 8., 9.]])

ndarray数组转换成列表

a = np.full(shape = (2,3,4), fill_value=2) a array([[[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]], [[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]]]) b = a.tolist() b [[[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]], [[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]]]

ndarray数组的索引和切片,下标从0开始

一维数组

a = np.array([9,8,7,6,5]) a array([9, 8, 7, 6, 5]) a[2] 7

从下标1开始,到下标5-1=4结束,步长为2

a[1:5:2] array([8, 6])

多维数组

a = np.arange(24).reshape((2,3,4)) a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])

第一个维度下标是1,第二个维度下标是2,第三个维度下标是3,维度之间用逗号分隔。

a[1,2,3] 23

一样可以用负数索引

a[-1,-1,-1] 23

取第一个维度上的全部数组,在第一个维度基础上取第二个维度下标为1的数组,在第二个维度的基础上取倒数第三个元素,组成新数组。

a[:,1,-3] array([ 5, 17]) a[:,1:3,:] array([[[ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[16, 17, 18, 19], [20, 21, 22, 23]]])

第三个维度加上步长2

a[:,1:,::2] array([[[ 4, 6], [ 8, 10]], [[16, 18], [20, 22]]])

ndarray数组运算

数组与标量之间的运算

数组与标量之间的运算作用与数组的每一个元素

实例:计算a与元素平均值的商 import numpy as np a = np.arange(24).reshape((2,3,4)) a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) a.mean() 11.5 a = a/a.mean() a array([[[0. , 0.08695652, 0.17391304, 0.26086957], [0.34782609, 0.43478261, 0.52173913, 0.60869565], [0.69565217, 0.7826087 , 0.86956522, 0.95652174]], [[1.04347826, 1.13043478, 1.2173913 , 1.30434783], [1.39130435, 1.47826087, 1.56521739, 1.65217391], [1.73913043, 1.82608696, 1.91304348, 2. ]]])

numpy一元函数

对ndarray中的数据执行元素及=级运算的函数

函数说明np.abs(x) np.fabs(x)计算数组各元素的绝对值np.sqrt(x)计算数组各元素的平方根np.square(x)计算数组各元素的平方np.log(x) np.log10(x) np.log2(x)计算数组各元素的自然对数、10底对数和2底对数np.cell(x) np.floor(x)计算数组各元素的ceiling值或floor值np.rint(x)计算数组各元素的四舍五入值np.modf(x)将数组各元素的小数、整数部分以两个独立的数组返回np.cos(x) np.cosh(x)np.sin(x) np.sinh(x)计算数组各元素的普通型和双曲型三角函数np.tan(x) np.tanh(x)np.exp(x)计算数组各元素的指数值np.sign(x)计算数组各元素的符号值,1(+),0,-1(-) 一元函数实例 a = np.arange(24).reshape((2,3,4)) a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) b = np.square(a) b array([[[ 0, 1, 4, 9], [ 16, 25, 36, 49], [ 64, 81, 100, 121]], [[144, 169, 196, 225], [256, 289, 324, 361], [400, 441, 484, 529]]], dtype=int32) a = np.sqrt(a) a array([[[0. , 1. , 1.18920712, 1.31607401], [1.41421356, 1.49534878, 1.56508458, 1.62657656], [1.68179283, 1.73205081, 1.77827941, 1.82116029]], [[1.86120972, 1.89882892, 1.93433642, 1.96798967], [2. , 2.03054318, 2.05976714, 2.08779763], [2.11474253, 2.14069514, 2.16573677, 2.1899387 ]]]) np.modf(a) (array([[[0. , 0. , 0.18920712, 0.31607401], [0.41421356, 0.49534878, 0.56508458, 0.62657656], [0.68179283, 0.73205081, 0.77827941, 0.82116029]], [[0.86120972, 0.89882892, 0.93433642, 0.96798967], [0. , 0.03054318, 0.05976714, 0.08779763], [0.11474253, 0.14069514, 0.16573677, 0.1899387 ]]]), array([[[0., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]], [[1., 1., 1., 1.], [2., 2., 2., 2.], [2., 2., 2., 2.]]]))

numpy二元函数

函数说明+-*/**两个数组各元素进行对应运算np.maximum(x,y) np.fmax()np.minimun(x,y) np.fmin()元素级的最大值、最小值计算np.mod(x,y)元素级模运算np.copysign(x,y)将数组y中各元素值的符号赋值给数组x对应元素> < <= >= == !=算术比较,产生布尔数组 a = np.arange(24).reshape((2,3,4)) b = np.sqrt(a) a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) b array([[[0. , 1. , 1.41421356, 1.73205081], [2. , 2.23606798, 2.44948974, 2.64575131], [2.82842712, 3. , 3.16227766, 3.31662479]], [[3.46410162, 3.60555128, 3.74165739, 3.87298335], [4. , 4.12310563, 4.24264069, 4.35889894], [4.47213595, 4.58257569, 4.69041576, 4.79583152]]]) np.maximum(a,b) array([[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]], [[12., 13., 14., 15.], [16., 17., 18., 19.], [20., 21., 22., 23.]]]) a>b array([[[False, False, True, True], [ True, True, True, True], [ True, True, True, True]], [[ True, True, True, True], [ True, True, True, True], [ True, True, True, True]]])

多维数组的数据存储

数组转换成文件 a.tofile(frame, sep=’’, format = ‘’)

frame: string,文件名sep: string,数据分割字符,如果是空串,则以二进制写入文件format: string,写入数据的格式 import numpy as np a = np.arange(24).reshape((2,3,4)) a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) a.tofile('b.dat', sep=',',format = '%d' )

a.tofile('c.dat',format = '%d' )

sep 默认为空串,所以数据以二进制形式存储

文件转换成数组 np.fromfile(frame, dtype=float, count=-1, sep=’’)

frame: string,文件dtype: 读取的数据类型count: 读入元素个数, -1表示读入整个文件sep: 数据分割字符串,如果是空串,写入文件为二进制 b = np.fromfile('b.dat', dtype = np.int, count = -1, sep = ',').reshape((2,3,4)) b array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) c = np.fromfile('c.dat', dtype = np.int ).reshape(2,3,4) c array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])

用以上方法进行存取数据,会造成数组维度的丢失,一般会再写一个文件来保存数组的维度,当数组需要从文件中获取的时候,再次读取存储维度的文件,将数组还原,一般用于大型的数组。那么有没有更加便捷的方法来存取数据呢?

numpy的便捷文件存取

数组转换成文件 np.save(fname,array) 或 np.savez(fname, array)

np.savez()对数据进行压缩,存储空间更小fname: 文件名,以.npy为扩展名,压缩扩展名.npzarray: 数组变量 a = np.arange(24).reshape((2,3,4)) a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) np.save('d.npy', a)

打开文件可以看到,数组以二进制的方式存入文件,并且把维度以明文的方式存储,np.load()的时候就会自动解析还原数组。

文件转换成数组 np.load(fname)

fname: 文件名,以.npy为扩展名,压缩扩展名.npz b = np.load('d.npy') b array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
最新回复(0)