python中的重要科学计算库numpy

本文主要包括numpy,matplotlib以及python在用法上的一些套路和坑。

ndarray复制问题

np.array(arr)np.copy(arr)都可以复制numpy数组,感谢来自评论区的指正。

1
2
3
4
arr = np.array([1,2,3,4,5])
arr2 = np.array(arr)
arr[2] = 999
print arr2

以上代码输出:[ 1 2 3 4 5]

ndarray去重

以下代码可以去除重复的行

1
2
3
4
a = rest_points.copy()
b = np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))
_, idx = np.unique(b, return_index=True)
rest_points = a[idx]

其中部分函数用法如下:

  1. np.ascontiguosarray

    1
    2
    3
    4
    5
    ref: numpy\core\numeric.py
    def asarray(a):
    return array(a, dtype, copy=False, order=order)
    def ascontiguousarray(a):
    return array(a, dtype, copy=False, order='C', ndmin=1)

    可见np.ascontiguousarray默认以C模式(而不是Fortran)模式输出数组,ndmin=1是为了保证C模式不出错(数组至少有一维)。

  2. np.ndarray.view
    表示用不同的type看这个数组
  3. np.dtype
    这是个比较奇特的函数,我还没有搞透彻,这里的意思是把那一行的数组转成二进制来表示,这样就成了一个对应着原来数组行数的一维数组,其中数组每一行的那个数是原数组对应行所有列的二进制表示。
  4. np.unique
    这就是找出筛出数组中的唯一项了。

最小二乘法

使用from scipy.optimize import leastsq可以做最小二乘法,但是有一点要非常注意:
一般我们拟合时,平面方程一般选取

1
z = -(a*x + b*y + d)

这样的形式。这样去表示一个数组,是可以满足大多数的需要的,但是当我们考虑拟合平面Ax + By + D = 0时,由于固定了C = 1,所以会导致A, B参数数量级过大,而被误认为产生了过拟合现象。

any()和all()

用来返回在指定轴上是否存在/对于任意的点都是True

ndarray的运算符/内置函数的适配

以下函数可以直接适用ndarray:

  • len 一般返回ndarray的行数
  • zip 同list直接的zip

向量化语句

向量化是函数式编程中的一个默认的特性,向量化风格的写法天生直观,并且便于优化以及实现并行计算。