导入numpy 并简单赋值
import numpy as np a = np.array([0, 1, 2, 3, 4, 5]) print a # 数组转换到2D矩阵 变成三行两列 b = a.reshape((3, 2)) print b # .ndim(空间维度的意思)即矩阵列数 print a.ndim print b.ndim # .shape查看矩阵形态,即几行几列 print b.shape
# numpy避免复制操作 直接修改值,a,b的值都变化
b[1][0] = 77
print b, a
# 结果为
# [[ 0 1]
# [77 3]
# [ 4 5]] [ 0 1 77 3 4 5]
# 需要一个复本,使用.copy(),这里c和a是完全独立的副本
c = a.reshape((3, 2)).copy()
c[0][0] = 99
print c
对数组操作的传递
a=np.array([1,2,3,4,5]) # 对数组操作的传递 print a*2 print a**2 # [ 0 2 4 6 8 10] # [ 0 1 4 9 16 25] # python list集的操作 print [1,2,3,4,5]*2 print [1,2,3,4,5]**2 # [1, 2, 3, 4, 5, 1, 2, 3, 4, 5] # TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
numpy的索引
# 将数组本身作为数组索引使用 # 显示数组a的第2,3,4个值 print a[np.array([2, 3, 4])] # [77,3,4] # 判断条件传递到每一个参数 print a>4 # [False False True False False True] # 存储判断结果 print a[a>4] # [77 5] # 修剪异常值,大于4的值置为4 a[a>4] = 4 print a # [0 1 4 3 4 4]
专门的修剪函数
# clip修剪,将超出边界的值用边界替代 a = np.array([11,22,33,1,2,3,-1]) print a.clip(0, 4) # [4 4 4 1 2 3 0]
处理不存在的值
对于包含的不合法的值,使用numpy.NAN做标记
# 模拟一个数据 c = np.array([1, 2, np.NAN, 4, 5, 6, 7]) print c # [ 1. 2. nan 4. 5. 6. 7.] # 注意后面有个.号
判断是否是无效值
print np.isnan(c) # [False False True False False False False] # 注意这个方法的调用
# 筛选有效数据 print c[~np.isnan(c)] # mean 求算数平均值,axis是轴 0算是x轴 1算是y轴 考虑x=1 y=2;x=3 y=4 >>> a = np.array([[1, 2], [3, 4]]) >>> np.mean(a) 2.5 >>> np.mean(a, axis=0) array([ 2., 3.]) >>> np.mean(a, axis=1) array([ 1.5, 3.5])
运行时间比较
normal_py_src = timeit.timeit('sum(x*x for x in xrange(1000))', number=10000) native_np_src = timeit.timeit('sum(na*na)', setup="import numpy as np; na=np.arange(10000)", number=10000) good_np_src = timeit.timeit('na.dot(na)', setup="import numpy as np; na=np.arange(10000)", number=10000) print("normal python:%f sec"%normal_py_src) print("Naive Numpy:%f sec"%native_np_src) print("Good py:%f sec"%good_np_src) #normal python:0.820022 sec #Naive Numpy:52.690701 sec #Good py:0.098299 sec
python 中访问个体数组元素是相当耗时的
-------------
附