Numpy常用属性与方法

n维数组对象:ndarray

ndarray对象主要由两部分构成,即实际的数据和描述这些数据的元数据(数据维度、类型)等。

相比于Python列表的优势

1、数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据,如下:

Python中的数组对象进行平方:

1
2
3
l = [1, 2, 3]
for i in range(len(a));
a[i] = a[i]**2

ndarray进行平方

1
2
3
import numpy as np
a = np.array([1, 2, 3])
a = a**2

2、设置专门的数组对象,经过优化,可以提升这类应用的运算速度

3、数组对象采用相同的数据类型,有助于节省运算和存储空间

ndarray对象属性

属性 说明
.ndim 秩,即轴的数量或维度的数量
.shape ndarray对象的尺度,对于矩阵,n行m列
.size ndarray对象元素的个数,相当于.shape中n*m的值
.dtype ndarray对象的元素类型
.itemsize ndarray对象中每个元素的大小,以字节为单位

ndarray元素类型

包括主要的一些类型,类型后面的数字代表长度,常见的如bool、int32、float32、complex64(虚数)等等。

常用方法

创建方法

从Python中的列表、元组等类型创建

1
x = np.array(list/tuple)

使用相应函数创建

函数 说明
np.arange(n) 类似range()函数,返回ndarray类型,元素从0到n‐1
np.ones(shape) 根据shape生成一个全1数组,shape是元组类型
np.zeros(shape) 根据shape生成一个全0数组,shape是元组类型
np.full(shape,val) 根据shape生成一个数组,每个元素值都是val
np.eye(n) 创建一个正方的n*n单位矩阵,对角线为1,其余为0
np.ones_like(a) 根据数组a的形状生成一个全1数组
np.zeros_like(a) 根据数组a的形状生成一个全0数组
np.full_like(a,val) 根据数组a的形状生成一个数组,每个元素值都是val

创建网格(meshgrid)

1
2


其他方法创建

函数 说明
np.linspace(begin, end, bia) 根据起止数据等间距地填充数据,形成数组(从begin到end,共bia个数)
np.concatenate() 将两个或多个数组合并成一个新的数组

示例:

1
2
3
4
5
6
7
8
9
>>> a = np.linspace(1,10,3)
>>> a
array([ 1. , 5.5, 10. ])
>>> b = np.linspace(1,10,3, endpoint=False)
>>> b
array([1., 4., 7.])
>>> c = np.concatenate((a, b))
>>> c
array([ 1. , 5.5, 10. , 1. , 4. , 7. ])

变换方法

维度变换

方法 说明
.reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape) 与.reshape()功能一致,但修改原数组
.flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变

如果只想指示一个维度,而自动决定其他维度有多少个值,可以使用-1的写法(如果不能整除会报错)

1
2
# 想让数组有5行,列数自动决定
x.reshape(5, -1)

类型变换

astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致

1
new_l = l.astype(new_type)

转换为列表

1
l = n.tolist()

数组的操作

索引与切片

ndarray数组的索引与切片与Python中的索引与切片大致相同

运算

ndarray数组与标量之间的运算作用于数组的每一个元素,包括平方立方等等,示例如下:

1
2
np.abs(n)	// 各元素的绝对值
np.sqrt(x) // 各元素的平方根

同时使用数组中进行大小比较等运算时,会返回一个数值为布尔类型的数组(也是每个元素进行比较

1
2
3
4
5
X = np.array([[1,2,3],[4,5,6]])
print(X > 3)
#######################################
[[False False False]
[ True True True]]

借用这个特性,可以完成对满足某一要求的元素进行如赋值等其他操作

1
2
3
4
5
6
X = np.array([[1,2,3],[4,5,6]])
X[X > 3] = 10
print(X)
####################################
[[ 1 2 3]
[10 10 10]]

合并与分割

函数 说明
np.concatenate([n1, n2], axis=1) 将矩阵n1、n2按照第1个维度合并(axis默认为0)。同时返回一个新的矩阵
np.vstack([n1, n2]) 在垂直的维度合并n1,n2
np.hstack([n1, n2]) 在水平方向合并n1,n2
x1, x2, x3 = np.split(x, [2,4], axis=1) 将x按照[0, 2)、[2, 4)、[4, end)进行分割并赋值(依此类推)
np.vsplit()、np.hsplit()

矩阵运算

函数 说明
A.dot(B) 矩阵乘法
A.T 矩阵转置
np.linalg.inv(A) 矩阵的逆
函数 说明
np.random.shuffle(x) 对x进行乱序处理
np.sort(x) 返回排序后的x

随机数函数

在numpy的子库numpy.random中

函数 说明
rand(d0,d1,..,dn) 根据d0‐dn作为维度创建随机数数组,浮点数,[0,1),均匀分布
randn(d0,d1,..,dn) 根据d0‐dn创建随机数数组,标准正态分布
randint(low, high, shape) 根据shape创建随机整数或整数数组,范围是[low, high)
seed(s) 随机数种子,s是给定的种子值(计算机中随机数都是“伪随机数”,依赖于该随机种子)
normal(均值, 方差, shape) 生成给定均值与方差的符合正态分布的数或矩阵,shape为(元组)

统计函数(聚合函数)

函数 说明
sum(a, axis=None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组
mean(a, axis=None) 根据给定轴axis计算数组a相关元素的期望,axis整数或元组
average(a,axis=None,weights=None) 根据给定轴axis计算数组a相关元素的加权平均值,weights是列表
std(a, axis=None) 根据给定轴axis计算数组a相关元素的标准差
var(a, axis=None) 根据给定轴axis计算数组a相关元素的方差
min(a) max(a) 计算数组a中元素的最小值、最大值
argmin(a) argmax(a) 计算数组a中元素最小值、最大值的降一维后下标

梯度函数

np.gradient(f),计算数组f中元素的梯度(即连续值之间的变化率),当f为多维时,返回每个维度梯度

1
2
3
4
5
>>> a = np.arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> np.gradient(a)
array([1., 1., 1., 1., 1.])

说明:以索引为2的值为例,该处梯度的计算值为(a[3] - a[1]) / 2 = 1

ndarray数据的读写

二维数据读写

CSV文件,以逗号作为分隔符的常见文件格式

np.savetxt():写入文件

1
2
3
4
5
# frame : 文件、字符串或产生器
# array : 存入文件的数组
# fmt : 写入文件的格式
# delimiter : 分割字符串,默认是任何空格
np.savetxt(frame, array, fmt='%.18e', delimiter=None)

例:

1
np.savetxt('a.csv', a, fmt='%d', delimiter=',')

np.loadtxt():读取文件

1
2
# unpack  : 如果True,读入属性将分别写入不同变量
np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)

多维数据存取

a.tofile()

1
2
3
4
# frame  : 文件、字符串
# sep : 数据分割字符串,如果是空串,写入文件为二进制
# format : 写入数据的格式
a.tofile(frame, sep=''format='%s')

np.fromfile()

1
2
3
# count  : 读入元素个数,‐1表示读入整个文件
# sep : 数据分割字符串,如果是空串,写入文件为二进制
np.fromfile(frame, dtype=float, count=‐1, sep='')

便捷文件存取

其中文件名称通常以.npy为拓展名

1
2
3
np.save(fname, array)

np.load(fname)
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2019-2021 子夜
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信