1. 整体复制和按块复制
已知数组:
In [17]: a = np.array([1,2,3])
In [18]:
返回如下数组:
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])
分析:
数组前半部分 1, 1, 1, 2, 2, 2, 3, 3, 3
通过 repeat
函数复制 3 次,后面部分通过 tile
函数复制 3 次,然后合并数据。
In [17]: a = np.array([1,2,3])
In [18]: np.hstack((np.repeat(a,3), np.tile(a,3)))
Out[18]: array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])
In [19]:
2. 向量化操作
借助 NumPy
的 vectorize
实现操作向量化。原生的 Python
列表不支持向量化操作,两个列表相加默认不是逐个元素相加:
In [19]: a = [1,2,3]
In [21]: b = [4,5,6]
In [22]: a + b
Out[22]: [1, 2, 3, 4, 5, 6]
In [23]:
但是,借助 vectorize
能实现矢量相加, addv
函数就能实现两个数组相加:
In [24]: def add(x, y):
...: return x+y
...:
In [25]: addv = np.vectorize(add)
In [26]: addv(a, b)
Out[26]: array([5, 7, 9])
In [27]:
3. 填充缺失值
如下数组,含有缺失值,使用 -1 填充:
In [32]: a = np.array([[ 0., np.nan, 2., 3.],
...: [ 4., 5., np.nan, 7.],
...: [ 8., 9., 10., 11.],
...: [12., 13., np.nan, 15.],
...: [16., 17., np.nan, 19.],
...: [20., 21., 22., 23.]])
一行代码, np.isnan(a)
逐元素检查,若为空则为 True
,否则为 False
,得到一个与原来 shape
相同的值为 True
和 False
的数组。
In [34]: a[np.isnan(a)] = -1
In [35]: a
Out[35]:
array([[ 0., -1., 2., 3.],
[ 4., 5., -1., 7.],
[ 8., 9., 10., 11.],
[12., 13., -1., 15.],
[16., 17., -1., 19.],
[20., 21., 22., 23.]])
In [36]:
4. 找缺失值
NumPy
使用 np.nan
标记缺失值,给定如下数组 a,求出缺失值的索引。如下使用 where
函数,返回满足条件的位置索引:
In [36]: a = np.array([ 0., 1., np.nan, 3., np.nan, np.nan, 6., 7., 8., 9.])
In [37]: a
Out[37]: array([ 0., 1., nan, ..., 7., 8., 9.])
In [38]: np.where(np.isnan(a))
Out[38]: (array([2, 4, 5], dtype=int64),)
In [39]:
5. 返回无缺失值的行
**给定数组,找出没有任何缺失值的行:
In [39]: a = np.array([[ 0., np.nan, 2., 3.],
...: [ 4., 5., np.nan, 7.],
...: [ 8., 9., 10., 11.],
...: [12., 13., np.nan, 15.],
...: [16., 17., np.nan, 19.],
...: [20., 21., 22., 23.]])
In [39]:
In [40]: m = np.sum(np.isnan(a), axis=1) == 0
In [41]: m
Out[41]: array([False, False, True, False, False, True])
In [42]: a[m]
Out[42]:
array([[ 8., 9., 10., 11.],
[20., 21., 22., 23.]])
In [43]: