1.虽然Python数组结构中的列表list实际上就是数组,但是列表list保存的是对象的指针,list中的元素在系统内存中是分散存储的,例如[0,1,2]需要3个指针和3个整数对象,浪费内存和计算时间。
2.NumPy数组存储在一个均匀连续的内存块中,访问更快;NumPy中的矩阵计算可以采用多线程的方式,计算更快。
维数是秩(rank),每一个线性数组是轴(axes)
import numpy as np # 通常喜欢将numpy用np表示
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6]])
b[0, 2] = 10 # 更改3为10
print(a.shape) # a的数组大小
print(b.shape) # b的数组大小
print(b)
结果:
(3,)
(2, 3)
[[ 1 2 10]
[ 4 5 6]]
如果我们需要实现C语言里的struct结构体,应该如何用NumPy定义呢?
import numpy as np
persontype = np.dtype({
'names': ['name', 'age', 'chinese', 'math', 'english'],
'formats': ['S32', 'i', 'i', 'i', 'i']}) # 数据名称及类型
peoples = np.array([('Rahcel', '18', '99', '80', '77'), ('Alice', '20', '95', '87', '73')], dtype=persontype) # 数据元素
ages = peoples[:]['age'] # 取出age
chineses = peoples[:]['chinese']
print(np.mean(ages)) # 求平均值
print(np.mean(chineses))
结果:
19.0
97.0
用Numpy进行数据运算是不是超级方便嘿嘿
universal function的缩写,对数组元素进行函数操作,基于C语言实现,运算速度超快的哦
import numpy as np
x1 = np.arange(1, 11, 2) # 等差数组,步长为2
x2 = np.linspace(1, 9, 5) # 等差数组,共有5个元素
print(x1)
print(x2)
结果:
[1 3 5 7 9]
[1. 3. 5. 7. 9.]
# 加减乘除、n方、取余
print(np.add(x1, x2))
print(np.subtract(x1, x2))
print(np.multiply(x1, x2))
print(np.divide(x1, x2))
print(np.power(x1, x2))
print(np.remainder(x1, x2))
结果:
[ 2. 6. 10. 14. 18.]
[0. 0. 0. 0. 0.]
[ 1. 9. 25. 49. 81.]
[1. 1. 1. 1. 1.]
[1.00000000e+00 2.70000000e+01 3.12500000e+03 8.23543000e+05
3.87420489e+08]
[0. 0. 0. 0. 0.]
# 统计函数
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 二维数组
print(np.amin(a)) # 最小值
print(np.amax(a)) # 最大值
print(np.amin(a, 0)) # 沿着axis=0轴(相当于列)的最小值
print(np.amin(a, 1)) # 沿着axis=1轴(相当于行)的最小值
print(np.amax(a, 0))
print(np.amax(a, 1))
结果:
1
9
[1 2 3]
[1 4 7]
[7 8 9]
[3 6 9]
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 二维数组
# 最大值与最小值之差 ptp()
print(np.ptp(a))
print(np.ptp(a, 0))
print(np.ptp(a, 1))
结果:
8
[6 6 6]
[2 2 2]
# 统计数组的百分位数 percentile()
print(np.percentile(a, 50))
print(np.percentile(a, 50, axis=0))
print(np.percentile(a, 50, axis=1))
结果:
5.0
[4. 5. 6.]
[2. 5. 8.]
# 统计数组中的中位数median() 平均数mean()
# 求中位数
print(np.median(a))
print(np.median(a, axis=0))
print(np.median(a, axis=1))
结果:
5.0
[4. 5. 6.]
[2. 5. 8.]
# 求平均数
print(np.mean(a))
print(np.mean(a, axis=0))
print(np.mean(a, axis=1))
结果:
5.0
[4. 5. 6.]
[2. 5. 8.]
# 统计数组中的加权平均值average()
a = np.array([1, 2, 3, 4])
wts = np.array([1, 2, 3, 4]) # 权重数组
print(np.average(a))
print(np.average(a, weights=wts))
结果:
2.5
3.0
还有好多好多····需要用的时候直接Google一下就好咯!
数据结构与算法里我们学过各种各样的排序算法,并且要求我们直接能写出算法伪代码orz,但是美丽的Python只需要我们指定算法名称就可以啦~所以我们当然是选取时间/空间复杂度表现最优秀的几个算法咯
快排被认为是目前基于比较的内部排序方法中最好的方法(大家还记得partition吗qaq就是这个)
在 NumPy 中这些排序算法一条语句就可以搞定。
import numpy as np
a = np.array([[1, 2, 3], [11, 5, 6], [7, 0, 9]]) # 二维数组
print(np.sort(a, axis=-1, kind="quicksort", order=None))
结果:
[[ 1 2 3]
[ 5 6 11]
[ 0 7 9]]