Python中的重要科学计算库numpy

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

axis

执行以下代码

1
2
3
4
5
import numpy as np
a = np.array([[1,2],[3,4]])
a
np.sum(a, axis=0)
np.sum(a, axis=1)

输出

1
2
3
4
5
6
7
8
>>> a
array([[1, 2],
[3, 4]])
>>> np.sum(a, axis=0)
array([4, 6])
>>> np.sum(a, axis=1)
array([3, 7])
>>>

可以看出,axis=0对每个纵轴Y,求和a[:, Y],压扁X轴。同理,axis=1对每个横轴求和a[X, :],压扁Y轴。

dtype与astype

有的时候,astype(int)会依旧输出numpy.int64,此时参考SoF,选用.item()

从ndarray到scalar

ndarray大小与变更

通过arr.shape可以输出其形状。一般一维数组的shape是(n, ),二维数组是(n, m)这样。对于一维数组也可以输入一个Scalar,而不是一元tuple。
通过resize函数或者resize方法可以变更ndarray的大小,但是使用resize方法可能出现ValueError: cannot resize an array references or is referenced by another array in this way. Use the resize function这个错误。

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
    这就是找出筛出数组中的唯一项了。

any()和all()

用来返回在指定轴上是否存在/对于任意的点都是True。例如(A==B).all()返回A和B中是否所有的数都对应相等。

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

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

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

向量化语句

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