目录
数组属性内存布局其他属性 数值类型dtype
常量创建数组创建0和1或指定数字填充的数组从现有数据创建数组创建范围数组创建重复元素数组创建随机元素数组
数组操作数组切片改变数组形状转置数组合并拆分数组查找数组唯一值数组转列表索引相关np.wherenp.choose
数学函数统计函数常用统计函数取置信区间
参考
数组属性
内存布局
方法描述ndarray.flags
有关数组内存布局的信息。ndarray.shape
数组维度的元组。ndarray.strides
遍历数组时每个维度中的字节元组。ndarray.ndim
数组维数。ndarray.data
Python缓冲区对象指向数组的数据的开头。ndarray.size
数组中的元素数。ndarray.itemsize
一个数组元素的长度,以字节为单位ndarray.nbytes
数组元素消耗的总字节数。ndarray.base
如果内存来自其他对象,则为基础对象。
a = np.array([1,2,3])
b = np.array([[1,2,3],[4,5,6]])
print(a.shape, b.shape) 数组a,b的维度元组
print(a.ndim, b.ndim) 数组a,b的维数
print(a.size, b.size) 数组a,b的元素个数
print(a.itemsize, a.nbytes) 数组a的一个元素长度和数组消耗总字节数
(3,) (2, 3)
1 2
3 6
4 12
其他属性
方法描述ndarray.T
转置数组。ndarray.real
数组的真实部分。ndarray.imag
数组的虚部。ndarray.flat
数组上的一维迭代器。ndarray.ctypes
一个简化数组与ctypes模块交互的对象。
数值类型dtype
数值类型 转换数组数值类型
a = np.array([[1,1,3],[4,4,6]])
b = a.astype(np.float64)
b.dtype
dtype('float64')
#返回数值类型的name
b.dtype.name
'float64'
常量
(正)无穷大:np.Inf, np.Infinity (负)无穷大:np.NINF 非数字:np.NAN, np.nan, np.NaN 负零:np.NZERO 正零:np.PZERO e:np.e π:np.pi
np.isinf: 显示哪些元素为正或负无穷大。 np.isposinf: 显示哪些元素是正无穷大。 np.isneginf: 显示哪些元素为负无穷大。 np.isnan: 显示哪些元素不是数字。 np.isfinite : 显示哪些元素是有限的 - 不是(非数字,正无穷大和负无穷大)之一
将数组中nan值替换成指定值
c = np.array([[1,2,3],[np.nan,5,6]])
print(c)
c[np.isnan(c)] = 1
print(c)
[[ 1. 2. 3.]
[nan 5. 6.]]
[[ 1. 2. 3.]
[999. 5. 6.]]
常量
创建数组
创建0和1或指定数字填充的数组
创建值为1的指定形状数组
array = np.ones((2,3), dtype=int)
创建值为0的指定形状数组
array = np.zeros((2,3), dtype=int)
创建与指定数组相同形状的1数组
array_like = np.ones_like(array)
创建与指定数组相同形状的0数组
array_like = np.zeros_like(array)
创建指定形状和填充值的数组
array = np.full((2,3), 4)
创建与指定数组相同形状的填充值数组
array_like = np.full_like(array, 3)
从现有数据创建数组
从已有’数据’创建数组
array = np.array([[1,2,3,7]])
根据列表数据创建数组
l = [1,2,3]
array = np.asarray(l)
创建一个数组副本,原数组修改,副本不会变化
array_copy = np.copy(array)
创建范围数组
创建给定起始,间隔数组, 起始默认为0,间隔默认为1
array = np.arange(0, 10, 2)
返回指定间隔内的等间隔数字,rendpoint控制是否包括终止点数字,retstep = True则返回范围数组和间隔
array = np.linspace(0, 10, 50, endpoint=True)
生成网格数据
lon = np.linspace(-180,180,37) # 网格精度为10°,共计37个经度点
lat = np.linspace(-90,90,19) # 网格精度为10°,共计19个纬度点
lons, lats = np.meshgrid(lon, lat) #以lon,lat为参数生成网格数据
lats, lons = np.mgrid[-90:91:5., -180:181:5.] # 网格精度为5°,网格shape为(37,73)
创建重复元素数组
>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> np.repeat(a,3) # 重复元素3次
array([0, 0, 0, 1, 1, 1, 2, 2, 2])
>>> np.tile(a,3) # 重复数组3次
array([0, 1, 2, 0, 1, 2, 0, 1, 2])
>>> np.tile(a,(3,2)) # 重复数组3行2列
array([[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]])
创建随机元素数组
np.random.random(3)
array([0.4129063 , 0.94242888, 0.10129428])
np.random.random((2,3)) # 创建指定形状的0-1内随机元素数组
array([[0.80530845, 0.96161533, 0.89166972],
[0.22920038, 0.84989557, 0.46865645]])
np.random.randint(5) # 创建指定形状和元素大小的随机整数数组
4
np.random.randint(1,5, size=(2,3))
array([[3, 3, 1],
[3, 3, 3]])
np.random.normal(10, 1, (2,3)) # 创建指定数值和标准差的随机数组
array([[ 9.03895038, 9.40851459, 10.22184416],
[10.35129551, 7.85367586, 8.51376757]])
数组操作
数组切片
a = np.arange(9)
a[-1] # 最后一个元素
8
a[2:5] # 返回第2到第5个元素
array([2, 3, 4])
a[:7:3] # 返回第0到第7个元素,步长为3
array([0, 3, 6])
a[::-1] # 返回逆序的数组
array([8, 7, 6, 5, 4, 3, 2, 1, 0])
改变数组形状
a = np.arange(8).reshape(2,4)
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
a = np.arange(8)
b = np.reshape(a, (2,4))
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
转置数组
a = np.arange(4).reshape(2,2)
a.T
array([[0, 1],
[2, 3]])
array([[0, 2],
[1, 3]])
c = np.transpose(a)
array([[0, 2],
[1, 3]])
#改变c 中元素,a会跟随变化
合并拆分数组
按行(垂直方向)堆叠数组
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
np.vstack((a,b))
array([[1, 2, 3],
[2, 3, 4]])
按列(水平方向)堆叠数组
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
np.hstack((a,b))
array([[1, 2],
[2, 3],
[3, 4]])
拆分数组
a = np.arange(8).reshape(2,4)
np.vsplit(a, 2) # 垂直方向拆分成2部分
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]])]
np.hsplit(a, 2) # 水平方向拆分成2部分
[array([[0, 1],
[4, 5]]),
array([[2, 3],
[6, 7]])]
查找数组唯一值
返回数组唯一值
a = np.array([[1,1,3],[4,4,6]])
np.unique(a)
[1 3 4 6]
返回数组唯一行
a = np.arange(3)
b = np.tile(a, (3,1))
array([[0, 1, 2],
[0, 1, 2],
[0, 1, 2]])
np.unique(b, axis=0)
[[0 1 2]]
返回唯一值的原始数组索引
a = np.array([[1,1,3],[4,4,6]])
u, indices = np.unique(a, return_inverse=True)
u
array([1, 3, 4, 6])
indices
array([0, 0, 1, 2, 2, 3], dtype=int64)
数组转列表
a = np.array([[1,1,3],[4,4,6]])
a.tolist()
[[1, 1, 3], [4, 4, 6]]
索引相关
np.where
#符合指定条件的数组元素将被掩膜,剩余元素执行指定运算
a = np.arange(6).reshape(2,3)
b = np.where(a > 3, a, a*2)
array([[0, 1, 2],
[3, 4, 5]])
b
array([[0, 2, 4],
[6, 4, 5]])
b = np.where(a > 3, a, 999)
array([[999, 999, 999],
[999, 4, 5]])
b = np.where(a > 3, a, np.nan) #这个在遥感影像绘图时可以将读取的nan值重新转换为nan
array([[nan, nan, nan],
[nan, 4., 5.]])
a = np.arange(6).reshape(2,3)
c = np.where(a!=2)
#返回指定条件的bool数组,如果是二维数组则返回两个元组分别表示二维的索引
(array([0, 0, 1, 1, 1], dtype=int64), array([0, 1, 0, 1, 2], dtype=int64))
np.choose
a = np.arange(100).reshape(25,4)
mask = np.greater(a, 50) # 返回a中与50关系的同维bool数组
b = np.choose(mask, (0, a)) # mask部分等于原值a, 非mask部分等于0
更多判断函数
方法描述allclose
(a, b[, rtol, atol, equal_nan])如果两个数组在公差范围内按元素方式相等,则返回True。isclose
(a, b[, rtol, atol, equal_nan])返回一个布尔数组,其中两个数组在公差范围内按元素方式相等。array_equal
(a1, a2)如果两个数组具有相同的形状和元素,则为True,否则为False。array_equiv
(a1, a2)如果输入数组的形状一致且所有元素均相等,则返回True。greater
(x1, x2, /[, out, where, casting, …])按元素返回(x1 > x2)的真值。greater_equal
(x1, x2, /[, out, where, …])按元素返回(x1 >= x2)的真值。less
(x1, x2, /[, out, where, casting, …])按元素返回(x1 < x2)的真值。less_equal
(x1, x2, /[, out, where, casting, …])按元素返回(x1 =< x2)的真值。equal
(x1, x2, /[, out, where, casting, …])按元素返回(x1 == x2)。not_equal
(x1, x2, /[, out, where, casting, …])按元素返回(x1 != x2)。
数学函数
NumPy函数math函数功能np.emath.e自然常数np.pimath.pi圆周率np.ceil()math.ceil()进尾取整np.floor()nath.floor去尾取整np.around()四舍五入到指定精度np.rint()四舍五入到最近整数np.deg2rad()/radians()math.radians度转弧度np.rad2deg()/degrees()math.degrees()弧度转度np.hypot()math.hypot()计算直角三角形的斜边np.square()平方np.sqrt()math.sqrt()开平方np.power()math.pow()幂np.exp()math.exp()指数np.log()/log10()/log2()math.log()/log10()/log2()对数np.sin()/arcsin()math.sin()/asin()正弦/反正弦np.cos()/arccos()math.cos()/acos()余弦/反余弦np.tan()/arctan()math.tan()/atan()正切/反正切
统计函数
常用统计函数
函数功能np.max/min(a, axis=None)np.nanmax/nanmin(a, axis=None)返回数组中的最大值/最小值忽略nan返回数组中的最大值/最小值np.argmax/argmin(a, axis=None)np.nanargmax/nanargmin(a, axis=None)返回数组中最大值和最小值的索引忽略nan返回数组中最大值和最小值的索引np.ptp(a, axis=None)返回数组中元素最大值与最小值的差np.median(a, axis=None)np.nanmedian(a, axis=None)返回数组元素的中位数忽略nan返回数组元素的中位数np.sum(a, axis=None)np.nansum(a, axis=None)按指定的轴求元素之和忽略nan按指定的轴求元素之和np.cumsum(a, axis=None)np.nancumsum(a, axis=None)按指定的轴求元素的累进和忽略nan按指定的轴求元素的累进和np.diff(a, axis=-1)按指定的轴返回相邻元素的差np.prod(a, axis=None)np.nanprod(a, axis=None)按指定的轴求元素之积忽略nan按指定的轴求元素之积np.mean(a, axis=None)np.nanmean(a, axis=None)按指定的轴返回元素的算数平均值忽略nan按指定的轴返回元素的算数平均值np.average()根据权重数据,返回数据数组所有元素的加权平均值np.var(a)np.nanvar(a)返回数组方差忽略nan返回数组方差np.std()np.nanstd()返回数组标准差忽略nan返回数组标准差np.corrcoef(a, b)返回两个数组的皮尔逊积矩相关系数
取置信区间
#返回指定数组 指定轴的指定百分位数值
np.percentile(a, 99, axis=0)
可以通过interpolation关键字设置插值方法 附一个来自官方手册的各种插值效果的展示
import matplotlib.pyplot as plt
a = np.arange(4)
p = np.linspace(0, 100, 6001)
ax = plt.gca()
lines = [
('linear', None),
('higher', '--'),
('lower', '--'),
('nearest', '-.'),
('midpoint', '-.'),
]
for interpolation, style in lines:
ax.plot(
p, np.percentile(a, p, interpolation=interpolation),
label=interpolation, linestyle=style)
ax.set(
title='Interpolation methods for list: ' + str(a),
xlabel='Percentile',
ylabel='List item returned',
yticks=a)
ax.legend()
plt.show()
参考
https://www.numpy.org.cn/reference/ https://blog.csdn.net/xufive/category_9506563.html