一.数组元素的增删查改
1.1 resize(a, new_shape)
如果元素数量不够,重复数组元素来填充新的形状(这就是它与shape和reshape的区别)。
1 2 3 4 5 6 7 8 9 10
| import numpy as np
a = np.array([[1,2,3],[4,5,6]]) print("原来的形状是:",a.shape) b = np.resize(a,(3,3)) print("补齐后的形状是:",b.shape) print(b)
|
结果:
1 2 3 4 5
| 原来的形状是: (2, 3) 补齐后的形状是: (3, 3) [[1 2 3] [4 5 6] [1 2 3]]
|
1 2 3 4 5 6 7 8
| a = np.array([[1,2,3],[4,5,6]]) print("原来的形状是:",a.shape) b = np.resize(a,(2,2)) print("补齐后的形状是:",b.shape) print(b)
|
结果:
1 2 3 4
| 原来的形状是: (2, 3) 补齐后的形状是: (2, 2) [[1 2] [3 4]]
|
resize
会先遍历原数组中的所有数据,如果元素不够,先把已有元素放在新数组中,然后复制所有数据,依次排列在原数据下面;若新数组更小,则依次排列原数据,多的丢弃。
1.2 append(arr, values, axis=None)
向 arr 数组中添加的值,在添加的反方向上需要和 arr 数组长度一致
axis :默认为 None,返回的是一维数组;当 axis =0 时,追加的值会扩充新的行,而列数保持不变,若 axis=1 则与其恰好相反。
1 2 3 4 5 6 7
| import numpy as np
a = np.array([[1,2,3],[4,5,6]]) b = np.array([[1,2,3],[4,5,6]])
print(np.append(a,b,axis=None))
|
结果:
1
| [1 2 3 4 5 6 1 2 3 4 5 6]
|
1 2 3 4 5
| a = np.array([[1,2,3],[4,5,6]]) b = np.array([[1,2,3]]) print(np.append(a,b,axis=0))
|
结果:
1 2 3
| [[1 2 3] [4 5 6] [1 2 3]]
|
1 2 3 4 5
| a = np.array([[1,2,3],[4,5,6]]) b = np.array([[1],[4]]) print(np.append(a,b,axis=1))
|
结果:
简单来讲,就是axis = 0
围绕着关于行变换的方向上做事(竖直),axis = 1
围绕着关于列变换的方向上做事(水平)。
1.3 insert(arr, obj, values, axis)
arr:输入的数组
obj:表示索引,在该索引之前插入 values 值
values:要插入的值,也可以是多个,但需要匹配数组某个方向的维度
axis:默认为 None,返回的是一维数组;当 axis =0 时,追加的值会被添加到行,而列数保持不变,若 axis=1 则与其恰好相反
1 2 3 4 5 6 7 8 9
| import numpy as np a = np.arange(6).reshape(2, 3) print(a) print()
b = np.insert(a, 3, 10, axis=None) print(b)
|
结果:
1 2 3 4
| [[0 1 2] [3 4 5]]
[ 0 1 2 10 3 4 5]
|
1 2 3 4 5 6 7
| a = np.arange(6).reshape(2, 3) print(a) print()
b = np.insert(a, 1, 10, axis=0) print(b)
|
结果:
1 2 3 4 5 6
| [[0 1 2] [3 4 5]]
[[ 0 1 2] [10 10 10] [ 3 4 5]]
|
1 2 3 4 5 6 7
| a = np.arange(6).reshape(2, 3) print(a) print()
b = np.insert(a, 1, [10,10], axis=1) print(b)
|
结果:
1 2 3 4 5
| [[0 1 2] [3 4 5]]
[[ 0 10 1 2] [ 3 10 4 5]]
|
1.4 delete(arr, obj, axis)
删掉某个轴上的子数组,并返回删除后的新数组,注意,原数组没改。
1 2 3 4 5 6
| import numpy as np a = np.array([[1,2,3],[4,5,6]])
print(np.delete(a, 0, axis=None))
|
结果:
1 2 3 4 5 6
| import numpy as np a = np.array([[1,2,3],[4,5,6]])
print(np.delete(a, 0, axis=0))
|
结果:
1 2 3 4 5 6
| import numpy as np a = np.array([[1,2,3],[4,5,6]])
print(np.delete(a, [0,1], axis=1))
|
结果:
1.5 argwhere
返回数组中非 0 元素的索引,若是多维数组则返回行、列索引组成的索引坐标
。
1 2 3 4 5 6 7 8 9 10 11 12
| import numpy as np a = np.arange(9).reshape(3,3) print(a)
print(np.argwhere(a)) print()
print(np.argwhere(a>4))
|
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [[0 1 2] [3 4 5] [6 7 8]] [[0 1] [0 2] [1 0] [1 1] [1 2] [2 0] [2 1] [2 2]]
[[1 2] [2 0] [2 1] [2 2]]
|
补充:where()
函数
同样默认返回元素为0的坐标,不同的是其返回的是列坐标与行坐标分别的数组,合并成一个元组。
1 2 3 4 5 6
| import numpy as np a = np.arange(9).reshape(3,3) print(a) print(np.where(a>6))
|
结果:
1 2 3 4
| [[0 1 2] [3 4 5] [6 7 8]] (array([2, 2], dtype=int64), array([1, 2], dtype=int64))
|
1.6 unique
1
| (ar, return_index=False, return_inverse=False, return_counts=False, axis=None)
|
ar:输入的数组
return_index:如果为 True,则返回新数组元素在原数组中的位置(索引)
return_inverse:如果为 True,则返回原数组元素在新数组中的位置(逆索引)
return_counts:如果为 True,则返回去重后的数组元素在原数组中出现的次数
默认功能是去重,即删去相同元素。
1 2 3 4 5 6
| import numpy as np
a = np.array([1,2,3,3,3,4,4,5,6,6,7]) print(a) print(np.unique(a))
|
结果:
1 2
| [1 2 3 3 3 4 4 5 6 6 7] [1 2 3 4 5 6 7]
|
1 2
| print(np.unique(a,return_index=True))
|
结果:
1
| (array([1, 2, 3, 4, 5, 6, 7]), array([ 0, 1, 2, 5, 7, 8, 10], dtype=int64))
|
1 2 3
|
print(np.unique(a, return_inverse=True))
|
结果:
1
| (array([1, 2, 3, 4, 5, 6, 7]), array([0, 1, 2, 2, 2, 3, 3, 4, 5, 5, 6], dtype=int64))
|
1 2
| print(np.unique(a, return_counts=True))
|
结果:
1
| (array([1, 2, 3, 4, 5, 6, 7]), array([1, 1, 3, 2, 1, 2, 1], dtype=int64))
|
所有输出中,后面的就是索引下标。
二. 统计函数
2.1 amin() 和 amax()
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import numpy as np a = np.arange(9).reshape(3,3) print(a)
print(np.amin(a,axis=0)) print()
print(np.amax(a,axis=1))
|
结果:
1 2 3 4 5 6
| [[0 1 2] [3 4 5] [6 7 8]] [0 1 2]
[2 5 8]
|
2.2 ptp
1 2 3 4 5 6 7 8 9 10 11 12
| import numpy as np a = np.arange(9).reshape(3,3) print(a)
print(np.ptp(a,axis=0)) print()
print(np.ptp(a,axis=1))
|
结果:
1 2 3 4 5 6
| [[0 1 2] [3 4 5] [6 7 8]] [6 6 6]
[2 2 2]
|
用于计算中位数,中位数是指将数组中的数据按从小到大的顺序排列后,位于中间位置的值。如果数组的长度是偶数,则中位数是中间两个数的平均值。
1 2 3 4 5 6
| import numpy as np a = np.arange(9).reshape(3,3) print(a) print(np.median(a))
|
结果:
1 2 3 4
| [[0 1 2] [3 4 5] [6 7 8]] 4.0
|
同时,也可以只从一个轴(行或列)的方向来算:
1 2 3 4 5 6 7
| print(np.median(a,axis=0)) print()
print(np.median(a,axis=1))
|
结果:
2.4 mean(a,axis=None)
用于计算数组的平均值。
1 2 3 4 5 6
| import numpy as np a = np.arange(9).reshape(3,3) print(a) print(np.mean(a))
|
结果:
2.4 mean(a,axis=None)
计算数组中元素的算术平均值。
1 2 3 4 5 6
| import numpy as np a = np.arange(9).reshape(3,3) print(a) print(np.mean(a))
|
结果:
1 2 3 4
| [[0 1 2] [3 4 5] [6 7 8]] 4.0
|
1 2 3 4 5
| print(np.mean(a,axis=0))
print(np.mean(a,axis=1))
|
结果:
2.5 average(a,wights = None,axis = None)
计算数组元素的加权平均值,最后被除的是所有权重之和。
1 2 3 4 5 6 7 8 9
| import numpy as np a = np.array([[1, 2, 3],[4,5,6]]) print(a)
x = np.array([[10,20,10],[20,30,20]]) print(np.average(a,weights=x))
|
结果:
1 2 3
| [[1 2 3] [4 5 6]] 3.909090909090909
|
1 2 3 4 5
| print(np.average(a, weights=x,axis=0))
print(np.average(a, weights=x,axis=1))
|
结果:
这里提一句,若所有权重之和为1,那么这里的结果就代表数学中的期望值。
2.6 var()
在 NumPy 中,计算方差时使用的是统计学中的方差公式,NumPy 的设计目标是处理实际数据集,而不是概率分布。
函数默认计算的是总体方差:

1 2 3 4
| import numpy as np a = np.array([1, 2, 3,4,5]) print(np.var(a))
|
结果:
也可以求样本方差:

1 2 3 4
| import numpy as np a = np.array([1, 2, 3,4,5]) print(np.var(a,ddof=1))
|
结果:
2.7 std()
标准差是方差的算术平方根,用来描述一组数据平均值的分散程度。
1 2 3 4
| import numpy as np a = np.array([1, 2, 3, 4, 5]) print(np.std(a))
|
结果: