numpy组队学习资料

This commit is contained in:
hanhuijin
2020-10-09 09:51:22 +08:00
parent 5a79e97714
commit c4a31c66d4
43 changed files with 15030 additions and 0 deletions

View File

@@ -0,0 +1,617 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"[toc]\n",
"\n",
"---\n",
"# 数组的创建\n",
"\n",
"导入 numpy。\n",
"\n",
"```\n",
"import numpy as np\n",
"```\n",
"\n",
"numpy 提供的最重要的数据结构是`ndarray`,它是 python 中`list`的扩展。\n",
"\n",
"## 1. 依据现有数据来创建 ndarray\n",
"\n",
"### **a通过array()函数进行创建。**\n",
"\n",
"```python\n",
"def array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0): \n",
"``` \n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"# 创建一维数组\n",
"a = np.array([0, 1, 2, 3, 4])\n",
"b = np.array((0, 1, 2, 3, 4))\n",
"print(a, type(a))\n",
"# [0 1 2 3 4] <class 'numpy.ndarray'>\n",
"print(b, type(b))\n",
"# [0 1 2 3 4] <class 'numpy.ndarray'>\n",
"\n",
"# 创建二维数组\n",
"c = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"print(c, type(c))\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]] <class 'numpy.ndarray'>\n",
"\n",
"# 创建三维数组\n",
"d = np.array([[(1.5, 2, 3), (4, 5, 6)],\n",
" [(3, 2, 1), (4, 5, 6)]])\n",
"print(d, type(d))\n",
"# [[[1.5 2. 3. ]\n",
"# [4. 5. 6. ]]\n",
"#\n",
"# [[3. 2. 1. ]\n",
"# [4. 5. 6. ]]] <class 'numpy.ndarray'>\n",
"```\n",
"\n",
"### **b通过asarray()函数进行创建**\n",
"\n",
"`array()`和`asarray()`都可以将结构数据转化为 ndarray但是`array()`和`asarray()`主要区别就是当数据源是**ndarray** 时,`array()`仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 `asarray()`不会。\n",
"\n",
"```python\n",
"def asarray(a, dtype=None, order=None):\n",
" return array(a, dtype, copy=False, order=order)\n",
"```\n",
"\n",
"【例】`array()`和`asarray()`都可以将结构数据转化为 ndarray\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]\n",
"y = np.array(x)\n",
"z = np.asarray(x)\n",
"x[1][2] = 2\n",
"print(x,type(x))\n",
"# [[1, 1, 1], [1, 1, 2], [1, 1, 1]] <class 'list'>\n",
"\n",
"print(y,type(y))\n",
"# [[1 1 1]\n",
"# [1 1 1]\n",
"# [1 1 1]] <class 'numpy.ndarray'>\n",
"\n",
"print(z,type(z))\n",
"# [[1 1 1]\n",
"# [1 1 1]\n",
"# [1 1 1]] <class 'numpy.ndarray'>\n",
"```\n",
"\n",
"【例】`array()`和`asarray()`的区别。(`array()`和`asarray()`主要区别就是当数据源是**ndarray** 时,`array()`仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 `asarray()`不会。)\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])\n",
"y = np.array(x)\n",
"z = np.asarray(x)\n",
"w = np.asarray(x, dtype=np.int)\n",
"x[1][2] = 2\n",
"print(x,type(x),x.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 2]\n",
"# [1 1 1]] <class 'numpy.ndarray'> int32\n",
"\n",
"print(y,type(y),y.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 1]\n",
"# [1 1 1]] <class 'numpy.ndarray'> int32\n",
"\n",
"print(z,type(z),z.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 2]\n",
"# [1 1 1]] <class 'numpy.ndarray'> int32\n",
"\n",
"print(w,type(w),w.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 2]\n",
"# [1 1 1]] <class 'numpy.ndarray'> int32\n",
"```\n",
"\n",
"\n",
"【例】更改为较大的dtype时其大小必须是array的最后一个axis的总大小以字节为单位的除数\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])\n",
"print(x, x.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 1]\n",
"# [1 1 1]] int32\n",
"x.dtype = np.float\n",
"\n",
"# ValueError: When changing to a larger dtype, its size must be a divisor of the total size in bytes of the last axis of the array.\n",
"```\n",
"\n",
"### **c通过fromfunction()函数进行创建**\n",
"\n",
"给函数绘图的时候可能会用到`fromfunction()`,该函数可从函数中创建数组。\n",
"\n",
"```python\n",
"def fromfunction(function, shape, **kwargs):\n",
"```\n",
"\n",
"\n",
"【例】通过在每个坐标上执行一个函数来构造数组。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"def f(x, y):\n",
" return 10 * x + y\n",
"\n",
"x = np.fromfunction(f, (5, 4), dtype=int)\n",
"print(x)\n",
"# [[ 0 1 2 3]\n",
"# [10 11 12 13]\n",
"# [20 21 22 23]\n",
"# [30 31 32 33]\n",
"# [40 41 42 43]]\n",
"\n",
"x = np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)\n",
"print(x)\n",
"# [[ True False False]\n",
"# [False True False]\n",
"# [False False True]]\n",
"\n",
"x = np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)\n",
"print(x)\n",
"# [[0 1 2]\n",
"# [1 2 3]\n",
"# [2 3 4]]\n",
"```\n",
"\n",
"\n",
"\n",
"## 2. 依据 ones 和 zeros 填充方式\n",
"\n",
"在机器学习任务中经常做的一件事就是初始化参数,需要用常数值或者随机值来创建一个固定大小的矩阵。\n",
"\n",
"### **a零数组**\n",
"\n",
"- `zeros()`函数:返回给定形状和类型的零数组。\n",
"- `zeros_like()`函数:返回与给定数组形状和类型相同的零数组。\n",
"\n",
"```python\n",
"def zeros(shape, dtype=None, order='C'):\n",
"def zeros_like(a, dtype=None, order='K', subok=True, shape=None):\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.zeros(5)\n",
"print(x) # [0. 0. 0. 0. 0.]\n",
"x = np.zeros([2, 3])\n",
"print(x)\n",
"# [[0. 0. 0.]\n",
"# [0. 0. 0.]]\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.zeros_like(x)\n",
"print(y)\n",
"# [[0 0 0]\n",
"# [0 0 0]]\n",
"```\n",
"\n",
"### **b1数组**\n",
"\n",
"- `ones()`函数返回给定形状和类型的1数组。\n",
"- `ones_like()`函数返回与给定数组形状和类型相同的1数组。\n",
"\n",
"```python\n",
"def ones(shape, dtype=None, order='C'):\n",
"def ones_like(a, dtype=None, order='K', subok=True, shape=None):\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.ones(5)\n",
"print(x) # [1. 1. 1. 1. 1.]\n",
"x = np.ones([2, 3])\n",
"print(x)\n",
"# [[1. 1. 1.]\n",
"# [1. 1. 1.]]\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.ones_like(x)\n",
"print(y)\n",
"# [[1 1 1]\n",
"# [1 1 1]]\n",
"```\n",
"\n",
"### **c空数组**\n",
"\n",
"- `empty()`函数:返回一个空数组,数组元素为随机数。\n",
"- `empty_like`函数:返回与给定数组具有相同形状和类型的新数组。\n",
"\n",
"```python\n",
"def empty(shape, dtype=None, order='C'): \n",
"def empty_like(prototype, dtype=None, order='K', subok=True, shape=None):\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.empty(5)\n",
"print(x)\n",
"# [1.95821574e-306 1.60219035e-306 1.37961506e-306 \n",
"# 9.34609790e-307 1.24610383e-306]\n",
"\n",
"x = np.empty((3, 2))\n",
"print(x)\n",
"# [[1.60220393e-306 9.34587382e-307]\n",
"# [8.45599367e-307 7.56598449e-307]\n",
"# [1.33509389e-306 3.59412896e-317]]\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.empty_like(x)\n",
"print(y)\n",
"# [[ 7209029 6422625 6619244]\n",
"# [ 100 707539280 504]]\n",
"```\n",
"\n",
"### **d单位数组**\n",
"\n",
"- `eye()`函数返回一个对角线上为1其它地方为零的单位数组。\n",
"- `identity()`函数:返回一个方的单位数组。\n",
"\n",
"```python\n",
"def eye(N, M=None, k=0, dtype=float, order='C'):\n",
"def identity(n, dtype=None):\n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.eye(4)\n",
"print(x)\n",
"# [[1. 0. 0. 0.]\n",
"# [0. 1. 0. 0.]\n",
"# [0. 0. 1. 0.]\n",
"# [0. 0. 0. 1.]]\n",
"\n",
"x = np.eye(2, 3)\n",
"print(x)\n",
"# [[1. 0. 0.]\n",
"# [0. 1. 0.]]\n",
"\n",
"x = np.identity(4)\n",
"print(x)\n",
"# [[1. 0. 0. 0.]\n",
"# [0. 1. 0. 0.]\n",
"# [0. 0. 1. 0.]\n",
"# [0. 0. 0. 1.]]\n",
"```\n",
"\n",
"### **e对角数组**\n",
"\n",
"- `diag()`函数:提取对角线或构造对角数组。\n",
"\n",
"```python\n",
"def diag(v, k=0):\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(9).reshape((3, 3))\n",
"print(x)\n",
"# [[0 1 2]\n",
"# [3 4 5]\n",
"# [6 7 8]]\n",
"print(np.diag(x)) # [0 4 8]\n",
"print(np.diag(x, k=1)) # [1 5]\n",
"print(np.diag(x, k=-1)) # [3 7]\n",
"\n",
"v = [1, 3, 5, 7]\n",
"x = np.diag(v)\n",
"print(x)\n",
"# [[1 0 0 0]\n",
"# [0 3 0 0]\n",
"# [0 0 5 0]\n",
"# [0 0 0 7]]\n",
"```\n",
"\n",
"### **f常数数组**\n",
"\n",
"- `full()`函数:返回一个常数数组。\n",
"- `full_like()`函数:返回与给定数组具有相同形状和类型的常数数组。\n",
"\n",
"```python\n",
"def full(shape, fill_value, dtype=None, order='C'):\n",
"def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):\n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.full((2,), 7)\n",
"print(x)\n",
"# [7 7]\n",
"\n",
"x = np.full(2, 7)\n",
"print(x)\n",
"# [7 7]\n",
"\n",
"x = np.full((2, 7), 7)\n",
"print(x)\n",
"# [[7 7 7 7 7 7 7]\n",
"# [7 7 7 7 7 7 7]]\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.full_like(x, 7)\n",
"print(y)\n",
"# [[7 7 7]\n",
"# [7 7 7]]\n",
"```\n",
"\n",
"\n",
"\n",
"## 3. 利用数值范围来创建ndarray\n",
" - `arange()`函数:返回给定间隔内的均匀间隔的值。\n",
" - `linspace()`函数:返回指定间隔内的等间隔数字。\n",
" - `logspace()`函数:返回数以对数刻度均匀分布。\n",
" - `numpy.random.rand()` 返回一个由[0,1)内的随机数组成的数组。\n",
"\n",
"```python\n",
"def arange([start,] stop[, step,], dtype=None): \n",
"def linspace(start, stop, num=50, endpoint=True, retstep=False, \n",
" dtype=None, axis=0):\n",
"def logspace(start, stop, num=50, endpoint=True, base=10.0, \n",
" dtype=None, axis=0):\n",
"def rand(d0, d1, ..., dn): \n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(5)\n",
"print(x) # [0 1 2 3 4]\n",
"\n",
"x = np.arange(3, 7, 2)\n",
"print(x) # [3 5]\n",
"\n",
"x = np.linspace(start=0, stop=2, num=9)\n",
"print(x) \n",
"# [0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]\n",
"\n",
"x = np.logspace(0, 1, 5)\n",
"print(np.around(x, 2))\n",
"# [ 1. 1.78 3.16 5.62 10. ] \n",
" #np.around 返回四舍五入后的值,可指定精度。\n",
" # around(a, decimals=0, out=None)\n",
" # a 输入数组\n",
" # decimals 要舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置\n",
"\n",
"\n",
"x = np.linspace(start=0, stop=1, num=5)\n",
"x = [10 ** i for i in x]\n",
"print(np.around(x, 2))\n",
"# [ 1. 1.78 3.16 5.62 10. ]\n",
"\n",
"x = np.random.random(5)\n",
"print(x)\n",
"# [0.41768753 0.16315577 0.80167915 0.99690199 0.11812291]\n",
"\n",
"x = np.random.random([2, 3])\n",
"print(x)\n",
"# [[0.41151858 0.93785153 0.57031309]\n",
"# [0.13482333 0.20583516 0.45429181]]\n",
"```\n",
"\n",
"\n",
"\n",
"---\n",
"## 4. 结构数组的创建\n",
"\n",
"结构数组,首先需要定义结构,然后利用`np.array()`来创建数组,其参数`dtype`为定义的结构。\n",
"\n",
"### **a利用字典来定义结构**\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"personType = np.dtype({\n",
" 'names': ['name', 'age', 'weight'],\n",
" 'formats': ['U30', 'i8', 'f8']})\n",
"\n",
"a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],\n",
" dtype=personType)\n",
"print(a, type(a))\n",
"# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]\n",
"# <class 'numpy.ndarray'>\n",
"```\n",
"\n",
"### **b利用包含多个元组的列表来定义结构**\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"personType = np.dtype([('name', 'U30'), ('age', 'i8'), ('weight', 'f8')])\n",
"a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],\n",
" dtype=personType)\n",
"print(a, type(a))\n",
"# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]\n",
"# <class 'numpy.ndarray'>\n",
"\n",
"# 结构数组的取值方式和一般数组差不多,可以通过下标取得元素:\n",
"print(a[0])\n",
"# ('Liming', 24, 63.9)\n",
"\n",
"print(a[-2:])\n",
"# [('Mike', 15, 67. ) ('Jan', 34, 45.8)]\n",
"\n",
"# 我们可以使用字段名作为下标获取对应的值\n",
"print(a['name'])\n",
"# ['Liming' 'Mike' 'Jan']\n",
"print(a['age'])\n",
"# [24 15 34]\n",
"print(a['weight'])\n",
"# [63.9 67. 45.8]\n",
"```\n",
"\n",
"---\n",
"# 数组的属性\n",
"\n",
"在使用 numpy 时,你会想知道数组的某些信息。很幸运,在这个包里边包含了很多便捷的方法,可以给你想要的信息。\n",
"\n",
"\n",
"\n",
" - `numpy.ndarray.ndim`用于返回数组的维数(轴的个数)也称为秩,一维数组的秩为 1二维数组的秩为 2以此类推。\n",
" - `numpy.ndarray.shape`表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 `ndim` 属性(秩)。\n",
" - `numpy.ndarray.size`数组中所有元素的总量,相当于数组的`shape`中所有元素的乘积,例如矩阵的元素总量为行与列的乘积。\n",
" - `numpy.ndarray.dtype` `ndarray` 对象的元素类型。\n",
" - `numpy.ndarray.itemsize`以字节的形式返回数组中每一个元素的大小。\n",
"\n",
"```python\n",
"class ndarray(object):\n",
" shape = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
" dtype = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
" size = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
" ndim = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
" itemsize = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 4, 5])\n",
"print(a.shape) # (5,)\n",
"print(a.dtype) # int32\n",
"print(a.size) # 5\n",
"print(a.ndim) # 1\n",
"print(a.itemsize) # 4\n",
"\n",
"b = np.array([[1, 2, 3], [4, 5, 6.0]])\n",
"print(b.shape) # (2, 3)\n",
"print(b.dtype) # float64\n",
"print(b.size) # 6\n",
"print(b.ndim) # 2\n",
"print(b.itemsize) # 8\n",
"```\n",
"\n",
"在`ndarray`中所有元素必须是同一类型,否则会自动向下转换,`int->float->str`。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 4, 5])\n",
"print(a) # [1 2 3 4 5]\n",
"b = np.array([1, 2, 3, 4, '5'])\n",
"print(b) # ['1' '2' '3' '4' '5']\n",
"c = np.array([1, 2, 3, 4, 5.0])\n",
"print(c) # [1. 2. 3. 4. 5.]\n",
"```\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.188px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,148 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 常量\n",
"\n",
"## numpy.nan\n",
"\n",
"- 表示空值。\n",
"\n",
"```\n",
"nan = NaN = NAN\n",
"```\n",
"\n",
"\n",
"【例】两个`numpy.nan`是不相等的。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"print(np.nan == np.nan) # False\n",
"print(np.nan != np.nan) # True\n",
"```\n",
"\n",
"- `numpy.isnan(x, *args, **kwargs)` Test element-wise for NaN and return result as a boolean array.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 1, 8, np.nan, 10])\n",
"print(x)\n",
"# [ 1. 1. 8. nan 10.]\n",
"\n",
"y = np.isnan(x)\n",
"print(y)\n",
"# [False False False True False]\n",
"\n",
"z = np.count_nonzero(y)\n",
"print(z) # 1\n",
"```\n",
"\n",
"\n",
"\n",
"## numpy.inf\n",
"- 表示正无穷大。\n",
"\n",
"```\n",
"Inf = inf = infty = Infinity = PINF\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"\n",
"```\n",
"\n",
"## numpy.pi\n",
"\n",
"- 表示圆周率\n",
"\n",
"```python\n",
"pi = 3.1415926535897932384626433...\n",
"```\n",
"\n",
"## numpy.e\n",
"\n",
"- 表示自然常数\n",
"\n",
"```python\n",
"e = 2.71828182845904523536028747135266249775724709369995...\n",
"```\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,250 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 数据类型\n",
"\n",
"## 常见数据类型\n",
"\n",
"Python 原生的数据类型相对较少, bool、int、float、str等。这在不需要关心数据在计算机中表示的所有方式的应用中是方便的。然而对于科学计算通常需要更多的控制。为了加以区分 numpy 在这些类型名称末尾都加了“_”。\n",
"\n",
"下表列举了常用 numpy 基本类型。\n",
"\n",
"\n",
"类型 | 备注 | 说明 \n",
"---|---|---\n",
"bool_ = bool8 | 8位 | 布尔类型\n",
"int8 = byte | 8位 | 整型\n",
"int16 = short |\t16位| 整型\n",
"int32 = intc | 32位| 整型\n",
"int_ = int64 = long = int0 = intp | 64位| 整型\n",
"uint8 = ubyte |8位 | 无符号整型\n",
"uint16 = ushort|16位| 无符号整型\n",
"uint32 = uintc|32位| 无符号整型\n",
"uint64 = uintp = uint0 = uint| 64位| 无符号整型\n",
"float16 = half|16位 | 浮点型\n",
"float32 = single| 32位| 浮点型\n",
"float_ = float64 = double| 64位| 浮点型\n",
"str_ = unicode_ = str0 = unicode| |Unicode 字符串\n",
"datetime64| |日期时间类型\n",
"timedelta64| |表示两个时间之间的间隔\n",
"\n",
"\n",
"\n",
"## 创建数据类型\n",
"\n",
"numpy 的数值类型实际上是 dtype 对象的实例。\n",
"\n",
"```python\n",
"class dtype(object):\n",
" def __init__(self, obj, align=False, copy=False):\n",
" pass\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"每个内建类型都有一个唯一定义它的字符代码,如下:\n",
"\n",
"字符 | \t对应类型|备注\n",
"---|---|---\n",
"b\t|boolean | 'b1'\n",
"i\t|signed integer | 'i1', 'i2', 'i4', 'i8'\n",
"u\t|unsigned integer | 'u1', 'u2' ,'u4' ,'u8'\n",
"f\t|floating-point | 'f2', 'f4', 'f8'\n",
"c\t|complex floating-point |\n",
"m\t|timedelta64 |表示两个时间之间的间隔\n",
"M\t|datetime64 |日期时间类型\n",
"O\t|object |\n",
"S\t|(byte-)string | S3表示长度为3的字符串\n",
"U\t|Unicode | Unicode 字符串\n",
"V\t|void\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.dtype('b1')\n",
"print(a.type) # <class 'numpy.bool_'>\n",
"print(a.itemsize) # 1\n",
"\n",
"a = np.dtype('i1')\n",
"print(a.type) # <class 'numpy.int8'>\n",
"print(a.itemsize) # 1\n",
"a = np.dtype('i2')\n",
"print(a.type) # <class 'numpy.int16'>\n",
"print(a.itemsize) # 2\n",
"a = np.dtype('i4')\n",
"print(a.type) # <class 'numpy.int32'>\n",
"print(a.itemsize) # 4\n",
"a = np.dtype('i8')\n",
"print(a.type) # <class 'numpy.int64'>\n",
"print(a.itemsize) # 8\n",
"\n",
"a = np.dtype('u1')\n",
"print(a.type) # <class 'numpy.uint8'>\n",
"print(a.itemsize) # 1\n",
"a = np.dtype('u2')\n",
"print(a.type) # <class 'numpy.uint16'>\n",
"print(a.itemsize) # 2\n",
"a = np.dtype('u4')\n",
"print(a.type) # <class 'numpy.uint32'>\n",
"print(a.itemsize) # 4\n",
"a = np.dtype('u8')\n",
"print(a.type) # <class 'numpy.uint64'>\n",
"print(a.itemsize) # 8\n",
"\n",
"a = np.dtype('f2')\n",
"print(a.type) # <class 'numpy.float16'>\n",
"print(a.itemsize) # 2\n",
"a = np.dtype('f4')\n",
"print(a.type) # <class 'numpy.float32'>\n",
"print(a.itemsize) # 4\n",
"a = np.dtype('f8')\n",
"print(a.type) # <class 'numpy.float64'>\n",
"print(a.itemsize) # 8\n",
"\n",
"a = np.dtype('S')\n",
"print(a.type) # <class 'numpy.bytes_'>\n",
"print(a.itemsize) # 0\n",
"a = np.dtype('S3')\n",
"print(a.type) # <class 'numpy.bytes_'>\n",
"print(a.itemsize) # 3\n",
"\n",
"a = np.dtype('U3')\n",
"print(a.type) # <class 'numpy.str_'>\n",
"print(a.itemsize) # 12\n",
"```\n",
"\n",
"## 数据类型信息\n",
"\n",
"Python 的浮点数通常是64位浮点数几乎等同于 `np.float64`。\n",
"\n",
"NumPy和Python整数类型的行为在整数溢出方面存在显着差异与 NumPy 不同Python 的`int` 是灵活的。这意味着Python整数可以扩展以容纳任何整数并且不会溢出。\n",
"\n",
"Machine limits for integer types.\n",
"```python\n",
"class iinfo(object):\n",
" def __init__(self, int_type):\n",
" pass\n",
" def min(self):\n",
" pass\n",
" def max(self):\n",
" pass\n",
"```\n",
"【例】\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"ii16 = np.iinfo(np.int16)\n",
"print(ii16.min) # -32768\n",
"print(ii16.max) # 32767\n",
"\n",
"ii32 = np.iinfo(np.int32)\n",
"print(ii32.min) # -2147483648\n",
"print(ii32.max) # 2147483647\n",
"```\n",
"\n",
"Machine limits for floating point types.\n",
"```python\n",
"class finfo(object):\n",
" def _init(self, dtype):\n",
"```\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"ff16 = np.finfo(np.float16)\n",
"print(ff16.bits) # 16\n",
"print(ff16.min) # -65500.0\n",
"print(ff16.max) # 65500.0\n",
"print(ff16.eps) # 0.000977\n",
"\n",
"ff32 = np.finfo(np.float32)\n",
"print(ff32.bits) # 32\n",
"print(ff32.min) # -3.4028235e+38\n",
"print(ff32.max) # 3.4028235e+38\n",
"print(ff32.eps) # 1.1920929e-07\n",
"```\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "218.2px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,356 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 时间日期和时间增量\n",
"\n",
"## datetime64 基础\n",
"\n",
"在 numpy 中,我们很方便的将字符串转换成时间日期类型 `datetime64``datetime` 已被 python 包含的日期时间库所占用)。\n",
"\n",
"`datatime64`是带单位的日期时间类型,其单位如下:\n",
"\n",
"日期单位 | 代码含义|时间单位 | 代码含义\n",
":---:|:---:|:---:|:---:\n",
"Y | 年 |h | 小时\n",
"M | 月 |m | 分钟\n",
"W | 周 |s | 秒\n",
"D | 天 |ms | 毫秒\n",
"- | - |us | 微秒\n",
"- | - |ns | 纳秒\n",
"- | - |ps | 皮秒\n",
"- | - |fs | 飞秒\n",
"- | - |as | 阿托秒\n",
"\n",
"注意:\n",
"- 1秒 = 1000 毫秒milliseconds\n",
"- 1毫秒 = 1000 微秒microseconds\n",
"\n",
"【例】从字符串创建 datetime64 类型时默认情况下numpy 会根据字符串自动选择对应的单位。\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.datetime64('2020-03-01')\n",
"print(a, a.dtype) # 2020-03-01 datetime64[D]\n",
"\n",
"a = np.datetime64('2020-03')\n",
"print(a, a.dtype) # 2020-03 datetime64[M]\n",
"\n",
"a = np.datetime64('2020-03-08 20:00:05')\n",
"print(a, a.dtype) # 2020-03-08T20:00:05 datetime64[s]\n",
"\n",
"a = np.datetime64('2020-03-08 20:00')\n",
"print(a, a.dtype) # 2020-03-08T20:00 datetime64[m]\n",
"\n",
"a = np.datetime64('2020-03-08 20')\n",
"print(a, a.dtype) # 2020-03-08T20 datetime64[h]\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"【例】从字符串创建 datetime64 类型时,可以强制指定使用的单位。\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.datetime64('2020-03', 'D')\n",
"print(a, a.dtype) # 2020-03-01 datetime64[D]\n",
"\n",
"a = np.datetime64('2020-03', 'Y')\n",
"print(a, a.dtype) # 2020 datetime64[Y]\n",
"\n",
"print(np.datetime64('2020-03') == np.datetime64('2020-03-01')) # True\n",
"print(np.datetime64('2020-03') == np.datetime64('2020-03-02')) #False\n",
"```\n",
"\n",
"由上例可以看出2019-03 和 2019-03-01 所表示的其实是同一个时间。\n",
"事实上,如果两个 datetime64 对象具有不同的单位,它们可能仍然代表相同的时刻。并且从较大的单位(如月份)转换为较小的单位(如天数)是安全的。\n",
"\n",
"\n",
"【例】从字符串创建 datetime64 数组时,如果单位不统一,则一律转化成其中最小的单位。\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array(['2020-03', '2020-03-08', '2020-03-08 20:00'], dtype='datetime64')\n",
"print(a, a.dtype)\n",
"# ['2020-03-01T00:00' '2020-03-08T00:00' '2020-03-08T20:00'] datetime64[m]\n",
"```\n",
"\n",
"\n",
"【例】使用`arange()`创建 datetime64 数组,用于生成日期范围。\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.arange('2020-08-01', '2020-08-10', dtype=np.datetime64)\n",
"print(a)\n",
"# ['2020-08-01' '2020-08-02' '2020-08-03' '2020-08-04' '2020-08-05'\n",
"# '2020-08-06' '2020-08-07' '2020-08-08' '2020-08-09']\n",
"print(a.dtype) # datetime64[D]\n",
"\n",
"a = np.arange('2020-08-01 20:00', '2020-08-10', dtype=np.datetime64)\n",
"print(a)\n",
"# ['2020-08-01T20:00' '2020-08-01T20:01' '2020-08-01T20:02' ...\n",
"# '2020-08-09T23:57' '2020-08-09T23:58' '2020-08-09T23:59']\n",
"print(a.dtype) # datetime64[m]\n",
"\n",
"a = np.arange('2020-05', '2020-12', dtype=np.datetime64)\n",
"print(a)\n",
"# ['2020-05' '2020-06' '2020-07' '2020-08' '2020-09' '2020-10' '2020-11']\n",
"print(a.dtype) # datetime64[M]\n",
"```\n",
"\n",
"## datetime64 和 timedelta64 运算\n",
"\n",
"【例】timedelta64 表示两个 datetime64 之间的差。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致。\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.datetime64('2020-03-08') - np.datetime64('2020-03-07')\n",
"b = np.datetime64('2020-03-08') - np.datetime64('202-03-07 08:00')\n",
"c = np.datetime64('2020-03-08') - np.datetime64('2020-03-07 23:00', 'D')\n",
"\n",
"print(a, a.dtype) # 1 days timedelta64[D]\n",
"print(b, b.dtype) # 956178240 minutes timedelta64[m]\n",
"print(c, c.dtype) # 1 days timedelta64[D]\n",
"\n",
"a = np.datetime64('2020-03') + np.timedelta64(20, 'D')\n",
"b = np.datetime64('2020-06-15 00:00') + np.timedelta64(12, 'h')\n",
"print(a, a.dtype) # 2020-03-21 datetime64[D]\n",
"print(b, b.dtype) # 2020-06-15T12:00 datetime64[m]\n",
"```\n",
"\n",
"【例】生成 timedelta64时要注意年'Y')和月('M')这两个单位无法和其它单位进行运算(一年有几天?一个月有几个小时?这些都是不确定的)。\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.timedelta64(1, 'Y')\n",
"b = np.timedelta64(a, 'M')\n",
"print(a) # 1 years\n",
"print(b) # 12 months\n",
"\n",
"c = np.timedelta64(1, 'h')\n",
"d = np.timedelta64(c, 'm')\n",
"print(c) # 1 hours\n",
"print(d) # 60 minutes\n",
"\n",
"print(np.timedelta64(a, 'D'))\n",
"# TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule 'same_kind'\n",
"\n",
"print(np.timedelta64(b, 'D'))\n",
"# TypeError: Cannot cast NumPy timedelta64 scalar from metadata [M] to [D] according to the rule 'same_kind'\n",
"```\n",
"\n",
"\n",
"【例】timedelta64 的运算。\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.timedelta64(1, 'Y')\n",
"b = np.timedelta64(6, 'M')\n",
"c = np.timedelta64(1, 'W')\n",
"d = np.timedelta64(1, 'D')\n",
"e = np.timedelta64(10, 'D')\n",
"\n",
"print(a) # 1 years\n",
"print(b) # 6 months\n",
"print(a + b) # 18 months\n",
"print(a - b) # 6 months\n",
"print(2 * a) # 2 years\n",
"print(a / b) # 2.0\n",
"print(c / d) # 7.0\n",
"print(c % e) # 7 days\n",
"```\n",
"\n",
"【例】numpy.datetime64 与 datetime.datetime 相互转换\n",
"```python\n",
"import numpy as np\n",
"import datetime\n",
"\n",
"dt = datetime.datetime(year=2020, month=6, day=1, hour=20, minute=5, second=30)\n",
"dt64 = np.datetime64(dt, 's')\n",
"print(dt64, dt64.dtype)\n",
"# 2020-06-01T20:05:30 datetime64[s]\n",
"\n",
"dt2 = dt64.astype(datetime.datetime)\n",
"print(dt2, type(dt2))\n",
"# 2020-06-01 20:05:30 <class 'datetime.datetime'>\n",
"```\n",
"\n",
"## datetime64 的应用\n",
"\n",
"为了允许在只有一周中某些日子有效的上下文中使用日期时间NumPy包含一组“busday”工作日功能。\n",
"\n",
"- `numpy.busday_offset(dates, offsets, roll='raise', weekmask='1111100', holidays=None, busdaycal=None, out=None)` First adjusts the date to fall on a valid day according to the roll rule, then applies offsets to the given dates counted in valid days.\n",
"\n",
"参数`roll`{'raise', 'nat', 'forward', 'following', 'backward', 'preceding', 'modifiedfollowing', 'modifiedpreceding'}\n",
"- 'raise' means to raise an exception for an invalid day.\n",
"- 'nat' means to return a NaT (not-a-time) for an invalid day.\n",
"- 'forward' and 'following' mean to take the first valid day later in time.\n",
"- 'backward' and 'preceding' mean to take the first valid day earlier in time.\n",
"\n",
"\n",
"【例】将指定的偏移量应用于工作日,单位天('D')。计算下一个工作日,如果当前日期为非工作日,默认报错。可以指定 `forward` 或 `backward` 规则来避免报错。(一个是向前取第一个有效的工作日,一个是向后取第一个有效的工作日)\n",
"```python\n",
"import numpy as np\n",
"\n",
"# 2020-07-10 星期五\n",
"a = np.busday_offset('2020-07-10', offsets=1)\n",
"print(a) # 2020-07-13\n",
"\n",
"a = np.busday_offset('2020-07-11', offsets=1)\n",
"print(a)\n",
"# ValueError: Non-business day date in busday_offset\n",
"\n",
"a = np.busday_offset('2020-07-11', offsets=0, roll='forward')\n",
"b = np.busday_offset('2020-07-11', offsets=0, roll='backward')\n",
"print(a) # 2020-07-13\n",
"print(b) # 2020-07-10\n",
"\n",
"a = np.busday_offset('2020-07-11', offsets=1, roll='forward')\n",
"b = np.busday_offset('2020-07-11', offsets=1, roll='backward')\n",
"print(a) # 2020-07-14\n",
"print(b) # 2020-07-13\n",
"```\n",
"\n",
"可以指定偏移量为 0 来获取当前日期向前或向后最近的工作日,当然,如果当前日期本身就是工作日,则直接返回当前日期。\n",
"\n",
"- `numpy.is_busday(dates, weekmask='1111100', holidays=None, busdaycal=None, out=None)` Calculates which of the given dates are valid days, and which are not.\n",
"\n",
"【例】返回指定日期是否是工作日。\n",
"```python\n",
"import numpy as np\n",
"\n",
"# 2020-07-10 星期五\n",
"a = np.is_busday('2020-07-10')\n",
"b = np.is_busday('2020-07-11')\n",
"print(a) # True\n",
"print(b) # False\n",
"```\n",
"\n",
"【例】统计一个 `datetime64[D]` 数组中的工作日天数。\n",
"```python\n",
"import numpy as np\n",
"\n",
"# 2020-07-10 星期五\n",
"begindates = np.datetime64('2020-07-10')\n",
"enddates = np.datetime64('2020-07-20')\n",
"a = np.arange(begindates, enddates, dtype='datetime64')\n",
"b = np.count_nonzero(np.is_busday(a))\n",
"print(a)\n",
"# ['2020-07-10' '2020-07-11' '2020-07-12' '2020-07-13' '2020-07-14'\n",
"# '2020-07-15' '2020-07-16' '2020-07-17' '2020-07-18' '2020-07-19']\n",
"print(b) # 6\n",
"```\n",
"\n",
"\n",
"【例】自定义周掩码值,即指定一周中哪些星期是工作日。\n",
"```python\n",
"import numpy as np\n",
"\n",
"# 2020-07-10 星期五\n",
"a = np.is_busday('2020-07-10', weekmask=[1, 1, 1, 1, 1, 0, 0])\n",
"b = np.is_busday('2020-07-10', weekmask=[1, 1, 1, 1, 0, 0, 1])\n",
"print(a) # True\n",
"print(b) # False\n",
"```\n",
"\n",
"- `numpy.busday_count(begindates, enddates, weekmask='1111100', holidays=[], busdaycal=None, out=None)`Counts the number of valid days between `begindates` and `enddates`, not including the day of `enddates`.\n",
"\n",
"【例】返回两个日期之间的工作日数量。\n",
"```python\n",
"import numpy as np\n",
"\n",
"# 2020-07-10 星期五\n",
"begindates = np.datetime64('2020-07-10')\n",
"enddates = np.datetime64('2020-07-20')\n",
"a = np.busday_count(begindates, enddates)\n",
"b = np.busday_count(enddates, begindates)\n",
"print(a) # 6\n",
"print(b) # -6\n",
"```\n",
"\n",
"\n",
"---\n",
"<b>参考图文</b>\n",
"\n",
"- https://www.jianshu.com/p/336cd77d9914\n",
"- https://www.cnblogs.com/gl1573/p/10549547.html#h2datetime64\n",
"- https://www.numpy.org.cn/reference/arrays/datetime.html#%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E5%8D%95%E4%BD%8D\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,617 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"[toc]\n",
"\n",
"---\n",
"# 数组的创建\n",
"\n",
"导入 numpy。\n",
"\n",
"```\n",
"import numpy as np\n",
"```\n",
"\n",
"numpy 提供的最重要的数据结构是`ndarray`,它是 python 中`list`的扩展。\n",
"\n",
"## 1. 依据现有数据来创建 ndarray\n",
"\n",
"### **a通过array()函数进行创建。**\n",
"\n",
"```python\n",
"def array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0): \n",
"``` \n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"# 创建一维数组\n",
"a = np.array([0, 1, 2, 3, 4])\n",
"b = np.array((0, 1, 2, 3, 4))\n",
"print(a, type(a))\n",
"# [0 1 2 3 4] <class 'numpy.ndarray'>\n",
"print(b, type(b))\n",
"# [0 1 2 3 4] <class 'numpy.ndarray'>\n",
"\n",
"# 创建二维数组\n",
"c = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"print(c, type(c))\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]] <class 'numpy.ndarray'>\n",
"\n",
"# 创建三维数组\n",
"d = np.array([[(1.5, 2, 3), (4, 5, 6)],\n",
" [(3, 2, 1), (4, 5, 6)]])\n",
"print(d, type(d))\n",
"# [[[1.5 2. 3. ]\n",
"# [4. 5. 6. ]]\n",
"#\n",
"# [[3. 2. 1. ]\n",
"# [4. 5. 6. ]]] <class 'numpy.ndarray'>\n",
"```\n",
"\n",
"### **b通过asarray()函数进行创建**\n",
"\n",
"`array()`和`asarray()`都可以将结构数据转化为 ndarray但是`array()`和`asarray()`主要区别就是当数据源是**ndarray** 时,`array()`仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 `asarray()`不会。\n",
"\n",
"```python\n",
"def asarray(a, dtype=None, order=None):\n",
" return array(a, dtype, copy=False, order=order)\n",
"```\n",
"\n",
"【例】`array()`和`asarray()`都可以将结构数据转化为 ndarray\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]\n",
"y = np.array(x)\n",
"z = np.asarray(x)\n",
"x[1][2] = 2\n",
"print(x,type(x))\n",
"# [[1, 1, 1], [1, 1, 2], [1, 1, 1]] <class 'list'>\n",
"\n",
"print(y,type(y))\n",
"# [[1 1 1]\n",
"# [1 1 1]\n",
"# [1 1 1]] <class 'numpy.ndarray'>\n",
"\n",
"print(z,type(z))\n",
"# [[1 1 1]\n",
"# [1 1 1]\n",
"# [1 1 1]] <class 'numpy.ndarray'>\n",
"```\n",
"\n",
"【例】`array()`和`asarray()`的区别。(`array()`和`asarray()`主要区别就是当数据源是**ndarray** 时,`array()`仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 `asarray()`不会。)\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])\n",
"y = np.array(x)\n",
"z = np.asarray(x)\n",
"w = np.asarray(x, dtype=np.int)\n",
"x[1][2] = 2\n",
"print(x,type(x),x.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 2]\n",
"# [1 1 1]] <class 'numpy.ndarray'> int32\n",
"\n",
"print(y,type(y),y.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 1]\n",
"# [1 1 1]] <class 'numpy.ndarray'> int32\n",
"\n",
"print(z,type(z),z.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 2]\n",
"# [1 1 1]] <class 'numpy.ndarray'> int32\n",
"\n",
"print(w,type(w),w.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 2]\n",
"# [1 1 1]] <class 'numpy.ndarray'> int32\n",
"```\n",
"\n",
"\n",
"【例】更改为较大的dtype时其大小必须是array的最后一个axis的总大小以字节为单位的除数\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])\n",
"print(x, x.dtype)\n",
"# [[1 1 1]\n",
"# [1 1 1]\n",
"# [1 1 1]] int32\n",
"x.dtype = np.float\n",
"\n",
"# ValueError: When changing to a larger dtype, its size must be a divisor of the total size in bytes of the last axis of the array.\n",
"```\n",
"\n",
"### **c通过fromfunction()函数进行创建**\n",
"\n",
"给函数绘图的时候可能会用到`fromfunction()`,该函数可从函数中创建数组。\n",
"\n",
"```python\n",
"def fromfunction(function, shape, **kwargs):\n",
"```\n",
"\n",
"\n",
"【例】通过在每个坐标上执行一个函数来构造数组。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"def f(x, y):\n",
" return 10 * x + y\n",
"\n",
"x = np.fromfunction(f, (5, 4), dtype=int)\n",
"print(x)\n",
"# [[ 0 1 2 3]\n",
"# [10 11 12 13]\n",
"# [20 21 22 23]\n",
"# [30 31 32 33]\n",
"# [40 41 42 43]]\n",
"\n",
"x = np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)\n",
"print(x)\n",
"# [[ True False False]\n",
"# [False True False]\n",
"# [False False True]]\n",
"\n",
"x = np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)\n",
"print(x)\n",
"# [[0 1 2]\n",
"# [1 2 3]\n",
"# [2 3 4]]\n",
"```\n",
"\n",
"\n",
"\n",
"## 2. 依据 ones 和 zeros 填充方式\n",
"\n",
"在机器学习任务中经常做的一件事就是初始化参数,需要用常数值或者随机值来创建一个固定大小的矩阵。\n",
"\n",
"### **a零数组**\n",
"\n",
"- `zeros()`函数:返回给定形状和类型的零数组。\n",
"- `zeros_like()`函数:返回与给定数组形状和类型相同的零数组。\n",
"\n",
"```python\n",
"def zeros(shape, dtype=None, order='C'):\n",
"def zeros_like(a, dtype=None, order='K', subok=True, shape=None):\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.zeros(5)\n",
"print(x) # [0. 0. 0. 0. 0.]\n",
"x = np.zeros([2, 3])\n",
"print(x)\n",
"# [[0. 0. 0.]\n",
"# [0. 0. 0.]]\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.zeros_like(x)\n",
"print(y)\n",
"# [[0 0 0]\n",
"# [0 0 0]]\n",
"```\n",
"\n",
"### **b1数组**\n",
"\n",
"- `ones()`函数返回给定形状和类型的1数组。\n",
"- `ones_like()`函数返回与给定数组形状和类型相同的1数组。\n",
"\n",
"```python\n",
"def ones(shape, dtype=None, order='C'):\n",
"def ones_like(a, dtype=None, order='K', subok=True, shape=None):\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.ones(5)\n",
"print(x) # [1. 1. 1. 1. 1.]\n",
"x = np.ones([2, 3])\n",
"print(x)\n",
"# [[1. 1. 1.]\n",
"# [1. 1. 1.]]\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.ones_like(x)\n",
"print(y)\n",
"# [[1 1 1]\n",
"# [1 1 1]]\n",
"```\n",
"\n",
"### **c空数组**\n",
"\n",
"- `empty()`函数:返回一个空数组,数组元素为随机数。\n",
"- `empty_like`函数:返回与给定数组具有相同形状和类型的新数组。\n",
"\n",
"```python\n",
"def empty(shape, dtype=None, order='C'): \n",
"def empty_like(prototype, dtype=None, order='K', subok=True, shape=None):\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.empty(5)\n",
"print(x)\n",
"# [1.95821574e-306 1.60219035e-306 1.37961506e-306 \n",
"# 9.34609790e-307 1.24610383e-306]\n",
"\n",
"x = np.empty((3, 2))\n",
"print(x)\n",
"# [[1.60220393e-306 9.34587382e-307]\n",
"# [8.45599367e-307 7.56598449e-307]\n",
"# [1.33509389e-306 3.59412896e-317]]\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.empty_like(x)\n",
"print(y)\n",
"# [[ 7209029 6422625 6619244]\n",
"# [ 100 707539280 504]]\n",
"```\n",
"\n",
"### **d单位数组**\n",
"\n",
"- `eye()`函数返回一个对角线上为1其它地方为零的单位数组。\n",
"- `identity()`函数:返回一个方的单位数组。\n",
"\n",
"```python\n",
"def eye(N, M=None, k=0, dtype=float, order='C'):\n",
"def identity(n, dtype=None):\n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.eye(4)\n",
"print(x)\n",
"# [[1. 0. 0. 0.]\n",
"# [0. 1. 0. 0.]\n",
"# [0. 0. 1. 0.]\n",
"# [0. 0. 0. 1.]]\n",
"\n",
"x = np.eye(2, 3)\n",
"print(x)\n",
"# [[1. 0. 0.]\n",
"# [0. 1. 0.]]\n",
"\n",
"x = np.identity(4)\n",
"print(x)\n",
"# [[1. 0. 0. 0.]\n",
"# [0. 1. 0. 0.]\n",
"# [0. 0. 1. 0.]\n",
"# [0. 0. 0. 1.]]\n",
"```\n",
"\n",
"### **e对角数组**\n",
"\n",
"- `diag()`函数:提取对角线或构造对角数组。\n",
"\n",
"```python\n",
"def diag(v, k=0):\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(9).reshape((3, 3))\n",
"print(x)\n",
"# [[0 1 2]\n",
"# [3 4 5]\n",
"# [6 7 8]]\n",
"print(np.diag(x)) # [0 4 8]\n",
"print(np.diag(x, k=1)) # [1 5]\n",
"print(np.diag(x, k=-1)) # [3 7]\n",
"\n",
"v = [1, 3, 5, 7]\n",
"x = np.diag(v)\n",
"print(x)\n",
"# [[1 0 0 0]\n",
"# [0 3 0 0]\n",
"# [0 0 5 0]\n",
"# [0 0 0 7]]\n",
"```\n",
"\n",
"### **f常数数组**\n",
"\n",
"- `full()`函数:返回一个常数数组。\n",
"- `full_like()`函数:返回与给定数组具有相同形状和类型的常数数组。\n",
"\n",
"```python\n",
"def full(shape, fill_value, dtype=None, order='C'):\n",
"def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):\n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.full((2,), 7)\n",
"print(x)\n",
"# [7 7]\n",
"\n",
"x = np.full(2, 7)\n",
"print(x)\n",
"# [7 7]\n",
"\n",
"x = np.full((2, 7), 7)\n",
"print(x)\n",
"# [[7 7 7 7 7 7 7]\n",
"# [7 7 7 7 7 7 7]]\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.full_like(x, 7)\n",
"print(y)\n",
"# [[7 7 7]\n",
"# [7 7 7]]\n",
"```\n",
"\n",
"\n",
"\n",
"## 3. 利用数值范围来创建ndarray\n",
" - `arange()`函数:返回给定间隔内的均匀间隔的值。\n",
" - `linspace()`函数:返回指定间隔内的等间隔数字。\n",
" - `logspace()`函数:返回数以对数刻度均匀分布。\n",
" - `numpy.random.rand()` 返回一个由[0,1)内的随机数组成的数组。\n",
"\n",
"```python\n",
"def arange([start,] stop[, step,], dtype=None): \n",
"def linspace(start, stop, num=50, endpoint=True, retstep=False, \n",
" dtype=None, axis=0):\n",
"def logspace(start, stop, num=50, endpoint=True, base=10.0, \n",
" dtype=None, axis=0):\n",
"def rand(d0, d1, ..., dn): \n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(5)\n",
"print(x) # [0 1 2 3 4]\n",
"\n",
"x = np.arange(3, 7, 2)\n",
"print(x) # [3 5]\n",
"\n",
"x = np.linspace(start=0, stop=2, num=9)\n",
"print(x) \n",
"# [0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]\n",
"\n",
"x = np.logspace(0, 1, 5)\n",
"print(np.around(x, 2))\n",
"# [ 1. 1.78 3.16 5.62 10. ] \n",
" #np.around 返回四舍五入后的值,可指定精度。\n",
" # around(a, decimals=0, out=None)\n",
" # a 输入数组\n",
" # decimals 要舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置\n",
"\n",
"\n",
"x = np.linspace(start=0, stop=1, num=5)\n",
"x = [10 ** i for i in x]\n",
"print(np.around(x, 2))\n",
"# [ 1. 1.78 3.16 5.62 10. ]\n",
"\n",
"x = np.random.random(5)\n",
"print(x)\n",
"# [0.41768753 0.16315577 0.80167915 0.99690199 0.11812291]\n",
"\n",
"x = np.random.random([2, 3])\n",
"print(x)\n",
"# [[0.41151858 0.93785153 0.57031309]\n",
"# [0.13482333 0.20583516 0.45429181]]\n",
"```\n",
"\n",
"\n",
"\n",
"---\n",
"## 4. 结构数组的创建\n",
"\n",
"结构数组,首先需要定义结构,然后利用`np.array()`来创建数组,其参数`dtype`为定义的结构。\n",
"\n",
"### **a利用字典来定义结构**\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"personType = np.dtype({\n",
" 'names': ['name', 'age', 'weight'],\n",
" 'formats': ['U30', 'i8', 'f8']})\n",
"\n",
"a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],\n",
" dtype=personType)\n",
"print(a, type(a))\n",
"# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]\n",
"# <class 'numpy.ndarray'>\n",
"```\n",
"\n",
"### **b利用包含多个元组的列表来定义结构**\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"personType = np.dtype([('name', 'U30'), ('age', 'i8'), ('weight', 'f8')])\n",
"a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],\n",
" dtype=personType)\n",
"print(a, type(a))\n",
"# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]\n",
"# <class 'numpy.ndarray'>\n",
"\n",
"# 结构数组的取值方式和一般数组差不多,可以通过下标取得元素:\n",
"print(a[0])\n",
"# ('Liming', 24, 63.9)\n",
"\n",
"print(a[-2:])\n",
"# [('Mike', 15, 67. ) ('Jan', 34, 45.8)]\n",
"\n",
"# 我们可以使用字段名作为下标获取对应的值\n",
"print(a['name'])\n",
"# ['Liming' 'Mike' 'Jan']\n",
"print(a['age'])\n",
"# [24 15 34]\n",
"print(a['weight'])\n",
"# [63.9 67. 45.8]\n",
"```\n",
"\n",
"---\n",
"# 数组的属性\n",
"\n",
"在使用 numpy 时,你会想知道数组的某些信息。很幸运,在这个包里边包含了很多便捷的方法,可以给你想要的信息。\n",
"\n",
"\n",
"\n",
" - `numpy.ndarray.ndim`用于返回数组的维数(轴的个数)也称为秩,一维数组的秩为 1二维数组的秩为 2以此类推。\n",
" - `numpy.ndarray.shape`表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 `ndim` 属性(秩)。\n",
" - `numpy.ndarray.size`数组中所有元素的总量,相当于数组的`shape`中所有元素的乘积,例如矩阵的元素总量为行与列的乘积。\n",
" - `numpy.ndarray.dtype` `ndarray` 对象的元素类型。\n",
" - `numpy.ndarray.itemsize`以字节的形式返回数组中每一个元素的大小。\n",
"\n",
"```python\n",
"class ndarray(object):\n",
" shape = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
" dtype = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
" size = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
" ndim = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
" itemsize = property(lambda self: object(), lambda self, v: None, lambda self: None)\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 4, 5])\n",
"print(a.shape) # (5,)\n",
"print(a.dtype) # int32\n",
"print(a.size) # 5\n",
"print(a.ndim) # 1\n",
"print(a.itemsize) # 4\n",
"\n",
"b = np.array([[1, 2, 3], [4, 5, 6.0]])\n",
"print(b.shape) # (2, 3)\n",
"print(b.dtype) # float64\n",
"print(b.size) # 6\n",
"print(b.ndim) # 2\n",
"print(b.itemsize) # 8\n",
"```\n",
"\n",
"在`ndarray`中所有元素必须是同一类型,否则会自动向下转换,`int->float->str`。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 4, 5])\n",
"print(a) # [1 2 3 4 5]\n",
"b = np.array([1, 2, 3, 4, '5'])\n",
"print(b) # ['1' '2' '3' '4' '5']\n",
"c = np.array([1, 2, 3, 4, 5.0])\n",
"print(c) # [1. 2. 3. 4. 5.]\n",
"```\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.188px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,819 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**什么是numpy**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"numpy是python中基于数组对象的科学计算库。\n",
"提炼关键字可以得出numpy以下三大特点\n",
"拥有n维数组对象;\n",
"拥有广播功能(后面讲到);\n",
"拥有各种科学计算API任你调用"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**如何安装numpy**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"因为numpy是一个python库所以使用python包管理工具pip或者conda都可以安装。\n",
"安装python后打开cmd命令行输入"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#pip install numpy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**什么是n维数组对象**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"n维数组ndarray对象是一系列同类数据的集合可以进行索引、切片、迭代操作。\n",
"numpy中可以使用array函数创建数组:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:37:45.921044Z",
"start_time": "2020-09-04T05:37:45.912067Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"np.array([1,2,3])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**如何区分一维、二维、多维?**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"判断一个数组是几维主要是看它有几个轴axis。\n",
"\n",
"一个轴表示一维数组,两个轴表示二维数组,以此类推。\n",
"\n",
"每个轴都代表一个一维数组。\n",
"\n",
"比如说,二维数组第一个轴里的每个元素都是一个一维数组,也就是第二个轴。\n",
"\n",
"一维数组一个轴:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:38:56.810220Z",
"start_time": "2020-09-04T05:38:56.807228Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[1,2,3]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"二维数组两个轴:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:39:21.661540Z",
"start_time": "2020-09-04T05:39:21.657550Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[[0, 1, 2], [3, 4, 5]]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[[0, 1, 2],\n",
" [3, 4, 5]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"三维数组三个轴:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:39:49.201611Z",
"start_time": "2020-09-04T05:39:49.196659Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[[[ 0, 1, 2],\n",
" [ 3, 4, 5]],\n",
"\n",
" [[ 6, 7, 8],\n",
" [ 9, 10, 11]]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"以此类推n维数组。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**以下表达式运行的结果分别是什么?**\n",
"\n",
"(提示: NaN = not a number, inf = infinity)\n",
"\n",
"0 * np.nan\n",
"\n",
"np.nan == np.nan\n",
"\n",
"np.inf > np.nan\n",
"\n",
"np.nan - np.nan\n",
"\n",
"0.3 == 3 * 0.1\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:29:21.779136Z",
"start_time": "2020-09-06T02:29:21.774149Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"nan\n",
"False\n",
"False\n",
"nan\n",
"False\n"
]
}
],
"source": [
"print(0 * np.nan)\n",
"print(np.nan == np.nan)\n",
"print(np.inf > np.nan)\n",
"print(np.nan - np.nan)\n",
"print(0.3 == 3 * 0.1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**将numpy的datetime64对象转换为datetime的datetime对象。**\n",
"\n",
"- `dt64 = np.datetime64('2020-02-25 22:10:10')`\n",
"\n",
"【知识点:时间日期和时间增量】\n",
"- 如何将numpy的datetime64对象转换为datetime的datetime对象"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:22:33.585786Z",
"start_time": "2020-09-06T03:22:33.577808Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2020-02-25 22:10:10 <class 'datetime.datetime'>\n"
]
}
],
"source": [
"import numpy as np\n",
"import datetime\n",
"\n",
"dt64 = np.datetime64('2020-02-25 22:10:10')\n",
"dt = dt64.astype(datetime.datetime)\n",
"print(dt, type(dt))\n",
"# 2020-02-25 22:10:10 <class 'datetime.datetime'>"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:23:02.362883Z",
"start_time": "2020-09-06T03:23:02.357896Z"
}
},
"source": [
"**给定一系列不连续的日期序列。填充缺失的日期,使其成为连续的日期序列。**\n",
"\n",
"- `dates = np.arange('2020-02-01', '2020-02-10', 2, np.datetime64)`\n",
"\n",
"【知识点:时间日期和时间增量、数学函数】\n",
"- 如何填写不规则系列的numpy日期中的缺失日期"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:23:17.318967Z",
"start_time": "2020-09-06T03:23:17.307994Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['2020-02-01' '2020-02-03' '2020-02-05' '2020-02-07' '2020-02-09']\n",
"['2020-02-01' '2020-02-02' '2020-02-03' '2020-02-04' '2020-02-05'\n",
" '2020-02-06' '2020-02-07' '2020-02-08' '2020-02-09']\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"dates = np.arange('2020-02-01', '2020-02-10', 2, np.datetime64)\n",
"print(dates)\n",
"# ['2020-02-01' '2020-02-03' '2020-02-05' '2020-02-07' '2020-02-09']\n",
"\n",
"out = []\n",
"for date, d in zip(dates, np.diff(dates)):\n",
" out.extend(np.arange(date, date + d))\n",
"fillin = np.array(out)\n",
"output = np.hstack([fillin, dates[-1]])\n",
"print(output)\n",
"# ['2020-02-01' '2020-02-02' '2020-02-03' '2020-02-04' '2020-02-05'\n",
"# '2020-02-06' '2020-02-07' '2020-02-08' '2020-02-09']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**如何得到昨天,今天,明天的的日期**\n",
"\n",
"【知识点:时间日期】\n",
"- (提示: np.datetime64, np.timedelta64)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:21:51.819371Z",
"start_time": "2020-09-14T09:21:51.815870Z"
}
},
"outputs": [],
"source": [
"yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')\n",
"today = np.datetime64('today', 'D')\n",
"tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:21:53.263787Z",
"start_time": "2020-09-14T09:21:53.258801Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Yesterday is 2020-09-13\n",
"Today is 2020-09-14\n",
"Tomorrow is 2020-09-15\n"
]
}
],
"source": [
"print (\"Yesterday is \" + str(yesterday))\n",
"print (\"Today is \" + str(today))\n",
"print (\"Tomorrow is \"+ str(tomorrow))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"**创建从0到9的一维数字数组。**\n",
"\n",
"【知识点:数组的创建】\n",
"- 如何创建一维数组?\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:21:17.599471Z",
"start_time": "2020-09-04T05:21:17.595447Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 1 2 3 4 5 6 7 8 9]\n"
]
}
],
"source": [
"#【答案】\n",
"\n",
"import numpy as np\n",
"\n",
"arr = np.arange(10)\n",
"print(arr)\n",
"# [0 1 2 3 4 5 6 7 8 9]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**创建一个元素全为`True`的 3×3 数组。**\n",
"\n",
"【知识点:数组的创建】\n",
"- 如何创建一个布尔数组?"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:23:28.582218Z",
"start_time": "2020-09-04T05:23:28.578229Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ True True True]\n",
" [ True True True]\n",
" [ True True True]]\n"
]
}
],
"source": [
"#答案\n",
"import numpy as np\n",
"\n",
"arr = np.full([3, 3], True, dtype=np.bool)\n",
"print(arr)\n",
"# [[ True True True]\n",
"# [ True True True]\n",
"# [ True True True]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**创建一个长度为10并且除了第五个值为1的空向量**\n",
"\n",
"【知识点:数组的创建】\n",
"\n",
"- (提示: array[4])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:57:59.004744Z",
"start_time": "2020-09-04T05:57:58.999757Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n"
]
}
],
"source": [
"Z = np.zeros(10)\n",
"Z[4] = 1\n",
"print(Z)"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:58:20.995843Z",
"start_time": "2020-09-04T05:58:20.990855Z"
}
},
"source": [
"**创建一个值域范围从10到49的向量**\n",
"\n",
"【知识点:创建数组】\n",
"\n",
"- (提示: np.arange)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-04T05:58:45.316583Z",
"start_time": "2020-09-04T05:58:45.312592Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33\n",
" 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49]\n"
]
}
],
"source": [
"Z = np.arange(10,50)\n",
"print(Z)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**创建一个 3x3x3的随机数组**\n",
"\n",
"【知识点:创建数组】\n",
"\n",
"(提示: np.random.random)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:25:01.890974Z",
"start_time": "2020-09-06T02:25:01.555976Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[[0.9656547 0.98794518 0.97311304]\n",
" [0.70795913 0.48301228 0.99415693]\n",
" [0.88059252 0.36213986 0.09431051]]\n",
"\n",
" [[0.19983998 0.27391144 0.75292906]\n",
" [0.19717369 0.97399681 0.84519249]\n",
" [0.1990827 0.75098517 0.49597504]]\n",
"\n",
" [[0.59227295 0.13609747 0.278576 ]\n",
" [0.0652865 0.30666851 0.44145043]\n",
" [0.28980157 0.64063686 0.13204375]]]\n"
]
}
],
"source": [
"Z = np.random.random((3,3,3))\n",
"print(Z)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**创建一个二维数组其中边界值为1其余值为0**\n",
"\n",
"【知识点:二维数组的创建】\n",
"\n",
"- (提示: array[1:-1, 1:-1])"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:26:25.019587Z",
"start_time": "2020-09-06T02:26:25.015563Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]\n"
]
}
],
"source": [
"Z = np.ones((10,10))\n",
"Z[1:-1,1:-1] = 0\n",
"print(Z)"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:24:54.695345Z",
"start_time": "2020-09-06T03:24:54.691389Z"
}
},
"source": [
"**创建长度为10的numpy数组从5开始在连续的数字之间的步长为3。**\n",
"\n",
"【知识点:数组的创建与属性】\n",
"- 如何在给定起始点、长度和步骤的情况下创建一个numpy数组序列"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:25:11.711285Z",
"start_time": "2020-09-06T03:25:11.708316Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 5 8 11 14 17 20 23 26 29 32]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"start = 5\n",
"step = 3\n",
"length = 10\n",
"a = np.arange(start, start + step * length, step)\n",
"print(a) # [ 5 8 11 14 17 20 23 26 29 32]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:25:34.766852Z",
"start_time": "2020-09-06T03:25:34.762862Z"
}
},
"source": [
"**将本地图像导入并将其转换为numpy数组。**\n",
"\n",
"【知识点:数组的创建与属性】\n",
"- 如何将图像转换为numpy数组"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:27:06.728838Z",
"start_time": "2020-09-06T03:27:06.496621Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(959, 959, 3) uint8\n"
]
}
],
"source": [
"import numpy as np\n",
"from PIL import Image\n",
"\n",
"img1 = Image.open('test.jpg')\n",
"a = np.array(img1)\n",
"\n",
"print(a.shape, a.dtype)\n",
"# (959, 959, 3) uint8"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,240 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **什么是numpy**\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **如何安装numpy**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **什么是n维数组对象**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **如何区分一维、二维、多维?**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **以下表达式运行的结果分别是什么?**\n",
"\n",
"(提示: NaN = not a number, inf = infinity)\n",
"\n",
"0 * np.nan\n",
"\n",
"np.nan == np.nan\n",
"\n",
"np.inf > np.nan\n",
"\n",
"np.nan - np.nan\n",
"\n",
"0.3 == 3 * 0.1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **将numpy的datetime64对象转换为datetime的datetime对象。**\n",
"\n",
"- `dt64 = np.datetime64('2020-02-25 22:10:10')`\n",
"\n",
"【知识点:时间日期和时间增量】\n",
"- 如何将numpy的datetime64对象转换为datetime的datetime对象"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **给定一系列不连续的日期序列。填充缺失的日期,使其成为连续的日期序列。**\n",
"\n",
"- `dates = np.arange('2020-02-01', '2020-02-10', 2, np.datetime64)`\n",
"\n",
"【知识点:时间日期和时间增量、数学函数】\n",
"- 如何填写不规则系列的numpy日期中的缺失日期"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **如何得到昨天,今天,明天的的日期**\n",
"\n",
"【知识点:时间日期】\n",
"- (提示: np.datetime64, np.timedelta64)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"### **创建从0到9的一维数字数组。**\n",
"\n",
"【知识点:数组的创建】\n",
"- 如何创建一维数组?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **创建一个元素全为`True`的 3×3 数组。**\n",
"\n",
"【知识点:数组的创建】\n",
"- 如何创建一个布尔数组?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **创建一个长度为10并且除了第五个值为1的空向量**\n",
"\n",
"【知识点:数组的创建】\n",
"\n",
"- (提示: array[4])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **创建一个值域范围从10到49的向量**\n",
"\n",
"【知识点:创建数组】\n",
"\n",
"- (提示: np.arange)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **创建一个 3x3x3的随机数组**\n",
"\n",
"【知识点:创建数组】\n",
"\n",
"(提示: np.random.random)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **创建一个二维数组其中边界值为1其余值为0**\n",
"\n",
"【知识点:二维数组的创建】\n",
"\n",
"- (提示: array[1:-1, 1:-1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **创建长度为10的numpy数组从5开始在连续的数字之间的步长为3。**\n",
"\n",
"【知识点:数组的创建与属性】\n",
"- 如何在给定起始点、长度和步骤的情况下创建一个numpy数组序列"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **将本地图像导入并将其转换为numpy数组。**\n",
"\n",
"【知识点:数组的创建与属性】\n",
"- 如何将图像转换为numpy数组"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,596 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 副本与视图\n",
"在 Numpy 中,尤其是在做数组运算或数组操作时,返回结果不是数组的 **副本** 就是 **视图**。\n",
"\n",
"在 Numpy 中,所有赋值运算不会为数组和数组中的任何元素创建副本。\n",
"\n",
"\n",
"- `numpy.ndarray.copy()` 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"y = x\n",
"y[0] = -1\n",
"print(x)\n",
"# [-1 2 3 4 5 6 7 8]\n",
"print(y)\n",
"# [-1 2 3 4 5 6 7 8]\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"y = x.copy()\n",
"y[0] = -1\n",
"print(x)\n",
"# [1 2 3 4 5 6 7 8]\n",
"print(y)\n",
"# [-1 2 3 4 5 6 7 8]\n",
"```\n",
"\n",
"\n",
"\n",
"【例】数组切片操作返回的对象只是原数组的视图。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x\n",
"y[::2, :3:2] = -1\n",
"print(x)\n",
"# [[-1 12 -1 14 15]\n",
"# [16 17 18 19 20]\n",
"# [-1 22 -1 24 25]\n",
"# [26 27 28 29 30]\n",
"# [-1 32 -1 34 35]]\n",
"print(y)\n",
"# [[-1 12 -1 14 15]\n",
"# [16 17 18 19 20]\n",
"# [-1 22 -1 24 25]\n",
"# [26 27 28 29 30]\n",
"# [-1 32 -1 34 35]]\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x.copy()\n",
"y[::2, :3:2] = -1\n",
"print(x)\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"print(y)\n",
"# [[-1 12 -1 14 15]\n",
"# [16 17 18 19 20]\n",
"# [-1 22 -1 24 25]\n",
"# [26 27 28 29 30]\n",
"# [-1 32 -1 34 35]]\n",
"```\n",
"\n",
"\n",
"# 索引与切片\n",
"\n",
"数组索引机制指的是用方括号([])加序号的形式引用单个数组元素,它的用处很多,比如抽取元素,选取数组的几个元素,甚至为其赋一个新值。\n",
"\n",
"## 整数索引\n",
"\n",
"【例】要获取数组的单个元素,指定元素的索引即可。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"print(x[2]) # 3\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"print(x[2]) # [21 22 23 24 25]\n",
"print(x[2][1]) # 22\n",
"print(x[2, 1]) # 22\n",
"```\n",
"\n",
"## 切片索引\n",
"\n",
"切片操作是指抽取数组的一部分元素生成新数组。对 python **列表**进行切片操作得到的数组是原数组的**副本**,而对 **Numpy** 数据进行切片操作得到的数组则是指向相同缓冲区的**视图**。\n",
"\n",
"\n",
"如果想抽取(或查看)数组的一部分,必须使用切片语法,也就是,把几个用冒号( `start:stop:step` )隔开的数字置于方括号内。\n",
"\n",
"为了更好地理解切片语法还应该了解不明确指明起始和结束位置的情况。如省去第一个数字numpy 会认为第一个数字是0如省去第二个数字numpy 则会认为第二个数字是数组的最大索引值如省去最后一个数字它将会被理解为1也就是抽取所有元素而不再考虑间隔。\n",
"\n",
"\n",
"【例】对一维数组的切片\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"print(x[0:2]) # [1 2]\n",
"print(x[1:5:2]) # [2 4]\n",
"print(x[2:]) # [3 4 5 6 7 8]\n",
"print(x[:2]) # [1 2]\n",
"print(x[-2:]) # [7 8]\n",
"print(x[:-2]) # [1 2 3 4 5 6]\n",
"print(x[:]) # [1 2 3 4 5 6 7 8]\n",
"print(x[::-1]) # [8 7 6 5 4 3 2 1]\n",
"```\n",
"\n",
"【例】对二维数组切片\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"print(x[0:2])\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]]\n",
"\n",
"print(x[1:5:2])\n",
"# [[16 17 18 19 20]\n",
"# [26 27 28 29 30]]\n",
"\n",
"print(x[2:])\n",
"# [[21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"print(x[:2])\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]]\n",
"\n",
"print(x[-2:])\n",
"# [[26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"print(x[:-2])\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]]\n",
"\n",
"print(x[:])\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"print(x[2, :]) # [21 22 23 24 25]\n",
"print(x[:, 2]) # [13 18 23 28 33]\n",
"print(x[0, 1:4]) # [12 13 14]\n",
"print(x[1:4, 0]) # [16 21 26]\n",
"print(x[1:3, 2:4])\n",
"# [[18 19]\n",
"# [23 24]]\n",
"\n",
"print(x[:, :])\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"print(x[::2, ::2])\n",
"# [[11 13 15]\n",
"# [21 23 25]\n",
"# [31 33 35]]\n",
"\n",
"print(x[::-1, :])\n",
"# [[31 32 33 34 35]\n",
"# [26 27 28 29 30]\n",
"# [21 22 23 24 25]\n",
"# [16 17 18 19 20]\n",
"# [11 12 13 14 15]]\n",
"\n",
"print(x[:, ::-1])\n",
"# [[15 14 13 12 11]\n",
"# [20 19 18 17 16]\n",
"# [25 24 23 22 21]\n",
"# [30 29 28 27 26]\n",
"# [35 34 33 32 31]]\n",
"```\n",
"\n",
"\n",
"通过对每个以逗号分隔的维度执行单独的切片,你可以对多维数组进行切片。因此,对于二维数组,我们的第一片定义了行的切片,第二片定义了列的切片。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"print(x)\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"x[0::2, 1::3] = 0\n",
"print(x)\n",
"# [[11 0 13 14 0]\n",
"# [16 17 18 19 20]\n",
"# [21 0 23 24 0]\n",
"# [26 27 28 29 30]\n",
"# [31 0 33 34 0]]\n",
"```\n",
"\n",
"## dots 索引\n",
"\n",
"NumPy 允许使用`...`表示足够多的冒号来构建完整的索引列表。\n",
"\n",
"比如,如果 `x` 是 5 维数组:\n",
"\n",
"- `x[1,2,...]` 等于 `x[1,2,:,:,:]`\n",
"- `x[...,3]` 等于 `x[:,:,:,:,3]` \n",
"- `x[4,...,5,:]` 等于 `x[4,:,:,5,:]`\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.randint(1, 100, [2, 2, 3])\n",
"print(x)\n",
"# [[[ 5 64 75]\n",
"# [57 27 31]]\n",
"# \n",
"# [[68 85 3]\n",
"# [93 26 25]]]\n",
"\n",
"print(x[1, ...])\n",
"# [[68 85 3]\n",
"# [93 26 25]]\n",
"\n",
"print(x[..., 2])\n",
"# [[75 31]\n",
"# [ 3 25]]\n",
"```\n",
"\n",
"\n",
"\n",
"## 整数数组索引\n",
"\n",
"【例】方括号内传入多个索引值,可以同时选择多个元素。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"r = [0, 1, 2]\n",
"print(x[r])\n",
"# [1 2 3]\n",
"\n",
"r = [0, 1, -1]\n",
"print(x[r])\n",
"# [1 2 8]\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"r = [0, 1, 2]\n",
"print(x[r])\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]]\n",
"\n",
"r = [0, 1, -1]\n",
"print(x[r])\n",
"\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [31 32 33 34 35]]\n",
"\n",
"r = [0, 1, 2]\n",
"c = [2, 3, 4]\n",
"y = x[r, c]\n",
"print(y)\n",
"# [13 19 25]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"r = np.array([[0, 1], [3, 4]])\n",
"print(x[r])\n",
"# [[1 2]\n",
"# [4 5]]\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"r = np.array([[0, 1], [3, 4]])\n",
"print(x[r])\n",
"# [[[11 12 13 14 15]\n",
"# [16 17 18 19 20]]\n",
"#\n",
"# [[26 27 28 29 30]\n",
"# [31 32 33 34 35]]]\n",
"\n",
"# 获取了 5X5 数组中的四个角的元素。\n",
"# 行索引是 [0,0] 和 [4,4],而列索引是 [0,4] 和 [0,4]。\n",
"r = np.array([[0, 0], [4, 4]])\n",
"c = np.array([[0, 4], [0, 4]])\n",
"y = x[r, c]\n",
"print(y)\n",
"# [[11 15]\n",
"# [31 35]]\n",
"```\n",
"\n",
"【例】可以借助切片`:`与整数数组组合。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = x[0:3, [1, 2, 2]]\n",
"print(y)\n",
"# [[12 13 13]\n",
"# [17 18 18]\n",
"# [22 23 23]]\n",
"```\n",
"\n",
"- `numpy. take(a, indices, axis=None, out=None, mode='raise')` Take elements from an array along an axis.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"r = [0, 1, 2]\n",
"print(np.take(x, r))\n",
"# [1 2 3]\n",
"\n",
"r = [0, 1, -1]\n",
"print(np.take(x, r))\n",
"# [1 2 8]\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"r = [0, 1, 2]\n",
"print(np.take(x, r, axis=0))\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]]\n",
"\n",
"r = [0, 1, -1]\n",
"print(np.take(x, r, axis=0))\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [31 32 33 34 35]]\n",
"\n",
"r = [0, 1, 2]\n",
"c = [2, 3, 4]\n",
"y = np.take(x, [r, c])\n",
"print(y)\n",
"# [[11 12 13]\n",
"# [13 14 15]]\n",
"```\n",
"\n",
"\n",
"## 布尔索引\n",
"\n",
"我们可以通过一个布尔数组来索引目标数组。\n",
"\n",
"【例】\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"y = x > 5\n",
"print(y)\n",
"# [False False False False False True True True]\n",
"print(x[x > 5])\n",
"# [6 7 8]\n",
"\n",
"x = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])\n",
"y = np.logical_not(np.isnan(x))\n",
"print(x[y])\n",
"# [1. 2. 3. 4. 5.]\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x > 25\n",
"print(y)\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"print(x[x > 25])\n",
"# [26 27 28 29 30 31 32 33 34 35]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"import matplotlib.pyplot as plt\n",
"\n",
"x = np.linspace(0, 2 * np.pi, 50)\n",
"y = np.sin(x)\n",
"print(len(x)) # 50\n",
"plt.plot(x, y)\n",
"\n",
"mask = y >= 0\n",
"print(len(x[mask])) # 25\n",
"print(mask)\n",
"'''\n",
"[ True True True True True True True True True True True True\n",
" True True True True True True True True True True True True\n",
" True False False False False False False False False False False False\n",
" False False False False False False False False False False False False\n",
" False False]\n",
"'''\n",
"plt.plot(x[mask], y[mask], 'bo')\n",
"\n",
"mask = np.logical_and(y >= 0, x <= np.pi / 2)\n",
"print(mask)\n",
"'''\n",
"[ True True True True True True True True True True True True\n",
" True False False False False False False False False False False False\n",
" False False False False False False False False False False False False\n",
" False False False False False False False False False False False False\n",
" False False]\n",
"'''\n",
"\n",
"plt.plot(x[mask], y[mask], 'go')\n",
"plt.show()\n",
"```\n",
"\n",
"![](https://img-blog.csdnimg.cn/20191109183704335.png)\n",
"\n",
"我们利用这些条件来选择图上的不同点。蓝色点(在图中还包括绿点,但绿点掩盖了蓝色点),显示值 大于0 的所有点。绿色点表示值 大于0 且 小于0.5π 的所有点。\n",
"\n",
"\n",
"\n",
"\n",
"---\n",
"# 数组迭代\n",
"\n",
"除了for循环Numpy 还提供另外一种更为优雅的遍历方法。\n",
"\n",
"- `apply_along_axis(func1d, axis, arr)` Apply a function to 1-D slices along the given axis.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.apply_along_axis(np.sum, 0, x)\n",
"print(y) # [105 110 115 120 125]\n",
"y = np.apply_along_axis(np.sum, 1, x)\n",
"print(y) # [ 65 90 115 140 165]\n",
"\n",
"y = np.apply_along_axis(np.mean, 0, x)\n",
"print(y) # [21. 22. 23. 24. 25.]\n",
"y = np.apply_along_axis(np.mean, 1, x)\n",
"print(y) # [13. 18. 23. 28. 33.]\n",
"\n",
"\n",
"def my_func(x):\n",
" return (x[0] + x[-1]) * 0.5\n",
"\n",
"\n",
"y = np.apply_along_axis(my_func, 0, x)\n",
"print(y) # [21. 22. 23. 24. 25.]\n",
"y = np.apply_along_axis(my_func, 1, x)\n",
"print(y) # [13. 18. 23. 28. 33.]\n",
"```\n",
"\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.2px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,291 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**交换数组arr中的列1和列2。**\n",
"\n",
"- `arr = np.arange(9).reshape(3, 3)`\n",
"\n",
"【知识点:索引与切片】\n",
"- 如何交换二维数组中的两列?"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:56:51.266868Z",
"start_time": "2020-09-06T02:56:51.260884Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]]\n",
"[[2 1 0]\n",
" [5 4 3]\n",
" [8 7 6]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"arr = np.arange(9).reshape(3, 3)\n",
"print(arr)\n",
"# [[0 1 2]\n",
"# [3 4 5]\n",
"# [6 7 8]]\n",
"\n",
"x = arr[:, [2, 1, 0]]\n",
"print(x)\n",
"# [[2 1 0]\n",
"# [5 4 3]\n",
"# [8 7 6]]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:57:26.869431Z",
"start_time": "2020-09-06T02:57:26.864408Z"
}
},
"source": [
"**交换数组arr中的第1行和第2行。**\n",
"- `arr = np.arange(9).reshape(3, 3)`\n",
"\n",
"【知识点:索引与切片】\n",
"- 如何交换二维数组中的两行?"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:57:43.336029Z",
"start_time": "2020-09-06T02:57:43.331042Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]]\n",
"[[3 4 5]\n",
" [0 1 2]\n",
" [6 7 8]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"arr = np.arange(9).reshape(3, 3)\n",
"print(arr)\n",
"# [[0 1 2]\n",
"# [3 4 5]\n",
"# [6 7 8]]\n",
"\n",
"x = arr[[1, 0, 2], :]\n",
"print(x)\n",
"# [[3 4 5]\n",
"# [0 1 2]\n",
"# [6 7 8]]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:58:04.059418Z",
"start_time": "2020-09-06T02:58:04.054430Z"
}
},
"source": [
"**反转二维数组arr的行。**\n",
"\n",
"- `arr = np.arange(9).reshape(3, 3)`\n",
"\n",
"【知识点:索引与切片】\n",
"- 如何反转二维数组的行?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:58:21.071694Z",
"start_time": "2020-09-06T02:58:21.067682Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]]\n",
"[[6 7 8]\n",
" [3 4 5]\n",
" [0 1 2]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"arr = np.arange(9).reshape(3, 3)\n",
"print(arr)\n",
"# [[0 1 2]\n",
"# [3 4 5]\n",
"# [6 7 8]]\n",
"\n",
"x = arr[::-1, :]\n",
"print(x)\n",
"# [[6 7 8]\n",
"# [3 4 5]\n",
"# [0 1 2]]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:58:39.880250Z",
"start_time": "2020-09-06T02:58:39.875230Z"
}
},
"source": [
"**反转二维数组arr的列。**\n",
"- `arr = np.arange(9).reshape(3, 3)`\n",
"\n",
"【知识点:索引与切片】\n",
"- 如何反转二维数组的列?"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:58:54.851622Z",
"start_time": "2020-09-06T02:58:54.846601Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]]\n",
"[[2 1 0]\n",
" [5 4 3]\n",
" [8 7 6]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"arr = np.arange(9).reshape(3, 3)\n",
"print(arr)\n",
"# [[0 1 2]\n",
"# [3 4 5]\n",
"# [6 7 8]]\n",
"\n",
"x = arr[:, ::-1]\n",
"print(x)\n",
"# [[2 1 0]\n",
"# [5 4 3]\n",
"# [8 7 6]]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,120 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **交换数组arr中的列1和列2。**\n",
"\n",
"- `arr = np.arange(9).reshape(3, 3)`\n",
"\n",
"【知识点:索引与切片】\n",
"- 如何交换二维数组中的两列?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **交换数组arr中的第1行和第2行。**\n",
"- `arr = np.arange(9).reshape(3, 3)`\n",
"\n",
"【知识点:索引与切片】\n",
"- 如何交换二维数组中的两行?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **反转二维数组arr的行。**\n",
"\n",
"- `arr = np.arange(9).reshape(3, 3)`\n",
"\n",
"【知识点:索引与切片】\n",
"- 如何反转二维数组的行?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **反转二维数组arr的列。**\n",
"- `arr = np.arange(9).reshape(3, 3)`\n",
"\n",
"【知识点:索引与切片】\n",
"- 如何反转二维数组的列?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,940 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 数组操作\n",
"\n",
"## 更改形状\n",
"\n",
"在对数组进行操作时,为了满足格式和计算的要求通常会改变其形状。\n",
"\n",
"- `numpy.ndarray.shape`表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 `ndim` 属性(秩)。\n",
"\n",
"【例】通过修改 shap 属性来改变数组的形状。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 9, 4, 5, 6, 7, 8])\n",
"print(x.shape) # (8,)\n",
"x.shape = [2, 4]\n",
"print(x)\n",
"# [[1 2 9 4]\n",
"# [5 6 7 8]]\n",
"```\n",
"\n",
"- `numpy.ndarray.flat` 将数组转换为一维的迭代器可以用for访问数组每一个元素。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x.flat\n",
"print(y)\n",
"# <numpy.flatiter object at 0x0000020F9BA10C60>\n",
"for i in y:\n",
" print(i, end=' ')\n",
"# 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35\n",
"\n",
"y[3] = 0\n",
"print(end='\\n')\n",
"print(x)\n",
"# [[11 12 13 0 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"```\n",
"\n",
"- `numpy.ndarray.flatten([order='C'])` 将数组的副本转换为一维数组,并返回。\n",
" - order'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'k' -- 元素在内存中的出现顺序。(简记)\n",
" - order{'C / F'AK}可选使用此索引顺序读取a的元素。'C'意味着以行大的C风格顺序对元素进行索引最后一个轴索引会更改F表示以列大的Fortran样式顺序索引元素其中第一个索引变化最快最后一个索引变化最快。请注意'C'和'F'选项不考虑基础数组的内存布局,仅引用轴索引的顺序.A'表示如果a为Fortran则以类似Fortran的索引顺序读取元素在内存中连续否则类似C的顺序。“ K”表示按照步序在内存中的顺序读取元素但步幅为负时反转数据除外。默认情况下使用Cindex顺序。\n",
"\n",
"【例】`flatten()`函数返回的是拷贝。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x.flatten()\n",
"print(y)\n",
"# [11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34\n",
"# 35]\n",
"\n",
"y[3] = 0\n",
"print(x)\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = x.flatten(order='F')\n",
"print(y)\n",
"# [11 16 21 26 31 12 17 22 27 32 13 18 23 28 33 14 19 24 29 34 15 20 25 30\n",
"# 35]\n",
"\n",
"y[3] = 0\n",
"print(x)\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"```\n",
"\n",
"\n",
"\n",
"- `numpy.ravel(a, order='C')`Return a contiguous flattened array.\n",
"\n",
"【例】`ravel()`返回的是视图。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.ravel(x)\n",
"print(y)\n",
"# [11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34\n",
"# 35]\n",
"\n",
"y[3] = 0\n",
"print(x)\n",
"# [[11 12 13 0 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"【例】order=F 就是拷贝\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.ravel(x, order='F')\n",
"print(y)\n",
"# [11 16 21 26 31 12 17 22 27 32 13 18 23 28 33 14 19 24 29 34 15 20 25 30\n",
"# 35]\n",
"\n",
"y[3] = 0\n",
"print(x)\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"```\n",
"\n",
"- `numpy.reshape(a, newshape[, order='C'])`在不更改数据的情况下为数组赋予新的形状。\n",
"\n",
"【例】`reshape()`函数当参数`newshape = [rows,-1]`时,将根据行数自动确定列数。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(12)\n",
"y = np.reshape(x, [3, 4])\n",
"print(y.dtype) # int32\n",
"print(y)\n",
"# [[ 0 1 2 3]\n",
"# [ 4 5 6 7]\n",
"# [ 8 9 10 11]]\n",
"\n",
"y = np.reshape(x, [3, -1])\n",
"print(y)\n",
"# [[ 0 1 2 3]\n",
"# [ 4 5 6 7]\n",
"# [ 8 9 10 11]]\n",
"\n",
"y = np.reshape(x,[-1,3])\n",
"print(y)\n",
"# [[ 0 1 2]\n",
"# [ 3 4 5]\n",
"# [ 6 7 8]\n",
"# [ 9 10 11]]\n",
"\n",
"y[0, 1] = 10\n",
"print(x)\n",
"# [ 0 10 2 3 4 5 6 7 8 9 10 11]改变x去reshape后y中的值x对应元素也改变\n",
"```\n",
"\n",
"【例】`reshape()`函数当参数`newshape = -1`时,表示将数组降为一维。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.randint(12, size=[2, 2, 3])\n",
"print(x)\n",
"# [[[11 9 1]\n",
"# [ 1 10 3]]\n",
"# \n",
"# [[ 0 6 1]\n",
"# [ 4 11 3]]]\n",
"y = np.reshape(x, -1)\n",
"print(y)\n",
"# [11 9 1 1 10 3 0 6 1 4 11 3]\n",
"```\n",
"\n",
"\n",
"\n",
"## 数组转置\n",
"\n",
"\n",
"- `numpy.transpose(a, axes=None)` Permute the dimensions of an array.\n",
"- `numpy.ndarray.T` Same as `self.transpose()`, except that self is returned if `self.ndim < 2`.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.rand(5, 5) * 10\n",
"x = np.around(x, 2)\n",
"print(x)\n",
"# [[6.74 8.46 6.74 5.45 1.25]\n",
"# [3.54 3.49 8.62 1.94 9.92]\n",
"# [5.03 7.22 1.6 8.7 0.43]\n",
"# [7.5 7.31 5.69 9.67 7.65]\n",
"# [1.8 9.52 2.78 5.87 4.14]]\n",
"y = x.T\n",
"print(y)\n",
"# [[6.74 3.54 5.03 7.5 1.8 ]\n",
"# [8.46 3.49 7.22 7.31 9.52]\n",
"# [6.74 8.62 1.6 5.69 2.78]\n",
"# [5.45 1.94 8.7 9.67 5.87]\n",
"# [1.25 9.92 0.43 7.65 4.14]]\n",
"y = np.transpose(x)\n",
"print(y)\n",
"# [[6.74 3.54 5.03 7.5 1.8 ]\n",
"# [8.46 3.49 7.22 7.31 9.52]\n",
"# [6.74 8.62 1.6 5.69 2.78]\n",
"# [5.45 1.94 8.7 9.67 5.87]\n",
"# [1.25 9.92 0.43 7.65 4.14]]\n",
"```\n",
"\n",
"\n",
"## 更改维度\n",
"\n",
"当创建一个数组之后,还可以给它增加一个维度,这在矩阵计算中经常会用到。\n",
"\n",
"- `numpy.newaxis = None` `None`的别名,对索引数组很有用。\n",
"\n",
"【例】很多工具包在进行计算时都会先判断输入数据的维度是否满足要求,如果输入数据达不到指定的维度时,可以使用`newaxis`参数来增加一个维度。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 9, 4, 5, 6, 7, 8])\n",
"print(x.shape) # (8,)\n",
"print(x) # [1 2 9 4 5 6 7 8]\n",
"\n",
"y = x[np.newaxis, :]\n",
"print(y.shape) # (1, 8)\n",
"print(y) # [[1 2 9 4 5 6 7 8]]\n",
"\n",
"y = x[:, np.newaxis]\n",
"print(y.shape) # (8, 1)\n",
"print(y)\n",
"# [[1]\n",
"# [2]\n",
"# [9]\n",
"# [4]\n",
"# [5]\n",
"# [6]\n",
"# [7]\n",
"# [8]]\n",
"```\n",
"\n",
"- `numpy.squeeze(a, axis=None)` 从数组的形状中删除单维度条目即把shape中为1的维度去掉。\n",
" - `a`表示输入的数组;\n",
" - `axis`用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;\n",
"\n",
"在机器学习和深度学习中,通常算法的结果是可以表示向量的数组(即包含两对或以上的方括号形式[[]]),如果直接利用这个数组进行画图可能显示界面为空(见后面的示例)。我们可以利用`squeeze()`函数将表示向量的数组转换为秩为1的数组这样利用 matplotlib 库函数画图时,就可以正常的显示结果了。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(10)\n",
"print(x.shape) # (10,)\n",
"x = x[np.newaxis, :]\n",
"print(x.shape) # (1, 10)\n",
"y = np.squeeze(x)\n",
"print(y.shape) # (10,)\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[[0], [1], [2]]])\n",
"print(x.shape) # (1, 3, 1)\n",
"print(x)\n",
"# [[[0]\n",
"# [1]\n",
"# [2]]]\n",
"\n",
"y = np.squeeze(x)\n",
"print(y.shape) # (3,)\n",
"print(y) # [0 1 2]\n",
"\n",
"y = np.squeeze(x, axis=0)\n",
"print(y.shape) # (3, 1)\n",
"print(y)\n",
"# [[0]\n",
"# [1]\n",
"# [2]]\n",
"\n",
"y = np.squeeze(x, axis=2)\n",
"print(y.shape) # (1, 3)\n",
"print(y) # [[0 1 2]]\n",
"\n",
"y = np.squeeze(x, axis=1)\n",
"# ValueError: cannot select an axis to squeeze out which has size not equal to one\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"x = np.array([[1, 4, 9, 16, 25]])\n",
"print(x.shape) # (1, 5)\n",
"plt.plot(x)\n",
"plt.show()\n",
"```\n",
"![](https://img-blog.csdnimg.cn/20200528095957317.png)\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"x = np.array([[1, 4, 9, 16, 25]])\n",
"x = np.squeeze(x)\n",
"print(x.shape) # (5, )\n",
"plt.plot(x)\n",
"plt.show()\n",
"```\n",
"\n",
"![](https://img-blog.csdnimg.cn/20200528100221464.png)\n",
"\n",
"## 数组组合\n",
"\n",
"如果要将两份数据组合到一起,就需要拼接操作。\n",
"\n",
"- `numpy.concatenate((a1, a2, ...), axis=0, out=None)` Join a sequence of arrays along an existing axis.\n",
"\n",
"【例】连接沿现有轴的数组序列原来xy都是一维的拼接后的结果也是一维的。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3])\n",
"y = np.array([7, 8, 9])\n",
"z = np.concatenate([x, y])\n",
"print(z)\n",
"# [1 2 3 7 8 9]\n",
"\n",
"z = np.concatenate([x, y], axis=0)\n",
"print(z)\n",
"# [1 2 3 7 8 9]\n",
"```\n",
"\n",
"【例】原来xy都是二维的拼接后的结果也是二维的。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3]).reshape(1, 3)\n",
"y = np.array([7, 8, 9]).reshape(1, 3)\n",
"z = np.concatenate([x, y])\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 7 8 9]]\n",
"z = np.concatenate([x, y], axis=0)\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 7 8 9]]\n",
"z = np.concatenate([x, y], axis=1)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]]\n",
"```\n",
"\n",
"【例】xy在原来的维度上进行拼接。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.array([[7, 8, 9], [10, 11, 12]])\n",
"z = np.concatenate([x, y])\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 4 5 6]\n",
"# [ 7 8 9]\n",
"# [10 11 12]]\n",
"z = np.concatenate([x, y], axis=0)\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 4 5 6]\n",
"# [ 7 8 9]\n",
"# [10 11 12]]\n",
"z = np.concatenate([x, y], axis=1)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]\n",
"# [ 4 5 6 10 11 12]]\n",
"```\n",
"\n",
"- `numpy.stack(arrays, axis=0, out=None)`Join a sequence of arrays along a new axis.\n",
"\n",
"\n",
"【例】沿着新的轴加入一系列数组stack为增加维度的拼接。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3])\n",
"y = np.array([7, 8, 9])\n",
"z = np.stack([x, y])\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.stack([x, y], axis=1)\n",
"print(z.shape) # (3, 2)\n",
"print(z)\n",
"# [[1 7]\n",
"# [2 8]\n",
"# [3 9]]\n",
"```\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3]).reshape(1, 3)\n",
"y = np.array([7, 8, 9]).reshape(1, 3)\n",
"z = np.stack([x, y])\n",
"print(z.shape) # (2, 1, 3)\n",
"print(z)\n",
"# [[[1 2 3]]\n",
"#\n",
"# [[7 8 9]]]\n",
"\n",
"z = np.stack([x, y], axis=1)\n",
"print(z.shape) # (1, 2, 3)\n",
"print(z)\n",
"# [[[1 2 3]\n",
"# [7 8 9]]]\n",
"\n",
"z = np.stack([x, y], axis=2)\n",
"print(z.shape) # (1, 3, 2)\n",
"print(z)\n",
"# [[[1 7]\n",
"# [2 8]\n",
"# [3 9]]]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.array([[7, 8, 9], [10, 11, 12]])\n",
"z = np.stack([x, y])\n",
"print(z.shape) # (2, 2, 3)\n",
"print(z)\n",
"# [[[ 1 2 3]\n",
"# [ 4 5 6]]\n",
"# \n",
"# [[ 7 8 9]\n",
"# [10 11 12]]]\n",
"\n",
"z = np.stack([x, y], axis=1)\n",
"print(z.shape) # (2, 2, 3)\n",
"print(z)\n",
"# [[[ 1 2 3]\n",
"# [ 7 8 9]]\n",
"# \n",
"# [[ 4 5 6]\n",
"# [10 11 12]]]\n",
"\n",
"z = np.stack([x, y], axis=2)\n",
"print(z.shape) # (2, 3, 2)\n",
"print(z)\n",
"# [[[ 1 7]\n",
"# [ 2 8]\n",
"# [ 3 9]]\n",
"# \n",
"# [[ 4 10]\n",
"# [ 5 11]\n",
"# [ 6 12]]]\n",
"```\n",
"\n",
"\n",
"- `numpy.vstack(tup)`Stack arrays in sequence vertically (row wise).\n",
"- `numpy.hstack(tup)`Stack arrays in sequence horizontally (column wise). \n",
"\n",
"\n",
"【例】一维的情况。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3])\n",
"y = np.array([7, 8, 9])\n",
"z = np.vstack((x, y))\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.stack([x, y])\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.hstack((x, y))\n",
"print(z.shape) # (6,)\n",
"print(z)\n",
"# [1 2 3 7 8 9]\n",
"\n",
"z = np.concatenate((x, y))\n",
"print(z.shape) # (6,)\n",
"print(z) # [1 2 3 7 8 9]\n",
"```\n",
"\n",
"\n",
"\n",
"【例】二维的情况。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3]).reshape(1, 3)\n",
"y = np.array([7, 8, 9]).reshape(1, 3)\n",
"z = np.vstack((x, y))\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.concatenate((x, y), axis=0)\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.hstack((x, y))\n",
"print(z.shape) # (1, 6)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]]\n",
"\n",
"z = np.concatenate((x, y), axis=1)\n",
"print(z.shape) # (1, 6)\n",
"print(z)\n",
"# [[1 2 3 7 8 9]]\n",
"```\n",
"\n",
"【例】二维的情况。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.array([[7, 8, 9], [10, 11, 12]])\n",
"z = np.vstack((x, y))\n",
"print(z.shape) # (4, 3)\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 4 5 6]\n",
"# [ 7 8 9]\n",
"# [10 11 12]]\n",
"\n",
"z = np.concatenate((x, y), axis=0)\n",
"print(z.shape) # (4, 3)\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 4 5 6]\n",
"# [ 7 8 9]\n",
"# [10 11 12]]\n",
"\n",
"z = np.hstack((x, y))\n",
"print(z.shape) # (2, 6)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]\n",
"# [ 4 5 6 10 11 12]]\n",
"\n",
"z = np.concatenate((x, y), axis=1)\n",
"print(z.shape) # (2, 6)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]\n",
"# [ 4 5 6 10 11 12]]\n",
"```\n",
"\n",
"`hstack(),vstack()`分别表示水平和竖直的拼接方式。在数据维度等于1时比较特殊。而当维度大于或等于2时它们的作用相当于`concatenate`,用于在已有轴上进行操作。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.hstack([np.array([1, 2, 3, 4]), 5])\n",
"print(a) # [1 2 3 4 5]\n",
"\n",
"a = np.concatenate([np.array([1, 2, 3, 4]), 5])\n",
"print(a)\n",
"# all the input arrays must have same number of dimensions, but the array at index 0 has 1 dimension(s) and the array at index 1 has 0 dimension(s)\n",
"```\n",
"\n",
"\n",
"## 数组拆分\n",
"\n",
"- `numpy.split(ary, indices_or_sections, axis=0)` Split an array into multiple sub-arrays as views into ary.\n",
"\n",
"【例】拆分数组。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14],\n",
" [16, 17, 18, 19],\n",
" [21, 22, 23, 24]])\n",
"y = np.split(x, [1, 3])\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]\n",
"\n",
"y = np.split(x, [1, 3], axis=1)\n",
"print(y)\n",
"# [array([[11],\n",
"# [16],\n",
"# [21]]), array([[12, 13],\n",
"# [17, 18],\n",
"# [22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"```\n",
"\n",
"\n",
"\n",
"- `numpy.vsplit(ary, indices_or_sections)` Split an array into multiple sub-arrays vertically (row-wise).\n",
"\n",
"【例】垂直切分是把数组按照高度切分\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14],\n",
" [16, 17, 18, 19],\n",
" [21, 22, 23, 24]])\n",
"y = np.vsplit(x, 3)\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19]]), array([[21, 22, 23, 24]])]\n",
"\n",
"y = np.split(x, 3)\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19]]), array([[21, 22, 23, 24]])]\n",
"\n",
"\n",
"y = np.vsplit(x, [1])\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]])]\n",
"\n",
"y = np.split(x, [1])\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]])]\n",
"\n",
"\n",
"y = np.vsplit(x, [1, 3])\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]\n",
"y = np.split(x, [1, 3], axis=0)\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]\n",
"```\n",
"\n",
"- `numpy.hsplit(ary, indices_or_sections)` Split an array into multiple sub-arrays horizontally (column-wise).\n",
"\n",
"\n",
"【例】水平切分是把数组按照宽度切分。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14],\n",
" [16, 17, 18, 19],\n",
" [21, 22, 23, 24]])\n",
"y = np.hsplit(x, 2)\n",
"print(y)\n",
"# [array([[11, 12],\n",
"# [16, 17],\n",
"# [21, 22]]), array([[13, 14],\n",
"# [18, 19],\n",
"# [23, 24]])]\n",
"\n",
"y = np.split(x, 2, axis=1)\n",
"print(y)\n",
"# [array([[11, 12],\n",
"# [16, 17],\n",
"# [21, 22]]), array([[13, 14],\n",
"# [18, 19],\n",
"# [23, 24]])]\n",
"\n",
"y = np.hsplit(x, [3])\n",
"print(y)\n",
"# [array([[11, 12, 13],\n",
"# [16, 17, 18],\n",
"# [21, 22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"\n",
"y = np.split(x, [3], axis=1)\n",
"print(y)\n",
"# [array([[11, 12, 13],\n",
"# [16, 17, 18],\n",
"# [21, 22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"\n",
"y = np.hsplit(x, [1, 3])\n",
"print(y)\n",
"# [array([[11],\n",
"# [16],\n",
"# [21]]), array([[12, 13],\n",
"# [17, 18],\n",
"# [22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"\n",
"y = np.split(x, [1, 3], axis=1)\n",
"print(y)\n",
"# [array([[11],\n",
"# [16],\n",
"# [21]]), array([[12, 13],\n",
"# [17, 18],\n",
"# [22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"## 数组平铺\n",
"\n",
"- `numpy.tile(A, reps)` Construct an array by repeating A the number of times given by reps.\n",
"\n",
"`tile`是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来。\n",
"\n",
"【例】将原矩阵横向、纵向地复制。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2], [3, 4]])\n",
"print(x)\n",
"# [[1 2]\n",
"# [3 4]]\n",
"\n",
"y = np.tile(x, (1, 3))\n",
"print(y)\n",
"# [[1 2 1 2 1 2]\n",
"# [3 4 3 4 3 4]]\n",
"\n",
"y = np.tile(x, (3, 1))\n",
"print(y)\n",
"# [[1 2]\n",
"# [3 4]\n",
"# [1 2]\n",
"# [3 4]\n",
"# [1 2]\n",
"# [3 4]]\n",
"\n",
"y = np.tile(x, (3, 3))\n",
"print(y)\n",
"# [[1 2 1 2 1 2]\n",
"# [3 4 3 4 3 4]\n",
"# [1 2 1 2 1 2]\n",
"# [3 4 3 4 3 4]\n",
"# [1 2 1 2 1 2]\n",
"# [3 4 3 4 3 4]]\n",
"```\n",
"\n",
"- `numpy.repeat(a, repeats, axis=None)` Repeat elements of an array.\n",
" - `axis=0`沿着y轴复制实际上增加了行数。\n",
" - `axis=1`沿着x轴复制实际上增加了列数。\n",
" - `repeats`,可以为一个数,也可以为一个矩阵。\n",
" - `axis=None`时就会flatten当前矩阵实际上就是变成了一个行向量。\n",
"\n",
"【例】重复数组的元素。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.repeat(3, 4)\n",
"print(x) # [3 3 3 3]\n",
"\n",
"x = np.array([[1, 2], [3, 4]])\n",
"y = np.repeat(x, 2)\n",
"print(y)\n",
"# [1 1 2 2 3 3 4 4]\n",
"\n",
"y = np.repeat(x, 2, axis=0)\n",
"print(y)\n",
"# [[1 2]\n",
"# [1 2]\n",
"# [3 4]\n",
"# [3 4]]\n",
"\n",
"y = np.repeat(x, 2, axis=1)\n",
"print(y)\n",
"# [[1 1 2 2]\n",
"# [3 3 4 4]]\n",
"\n",
"y = np.repeat(x, [2, 3], axis=0)\n",
"print(y)\n",
"# [[1 2]\n",
"# [1 2]\n",
"# [3 4]\n",
"# [3 4]\n",
"# [3 4]]\n",
"\n",
"y = np.repeat(x, [2, 3], axis=1)\n",
"print(y)\n",
"# [[1 1 2 2 2]\n",
"# [3 3 4 4 4]]\n",
"```\n",
"\n",
"---\n",
"## 添加和删除元素\n",
"\n",
"- `numpy.unique(ar, return_index=False, return_inverse=False,return_counts=False, axis=None)` Find the unique elements of an array.\n",
" - return_indexthe indices of the input array that give the unique values\n",
" - return_inversethe indices of the unique array that reconstruct the input array\n",
" - return_countsthe number of times each unique value comes up in the input array\n",
"\n",
"\n",
"\n",
"\n",
"【例】查找数组的唯一元素。\n",
"```python\n",
"a=np.array([1,1,2,3,3,4,4])\n",
"b=np.unique(a,return_counts=True)\n",
"print(b[0][list(b[1]).index(1)])\n",
"#2\n",
"```\n",
"\n",
"---\n",
"**参考文献**\n",
"- https://blog.csdn.net/csdn15698845876/article/details/73380803\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"ExecuteTime": {
"end_time": "2020-08-30T13:01:49.899843Z",
"start_time": "2020-08-30T13:01:49.895853Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n"
]
}
],
"source": [
"a=np.array([1,1,2,3,3,4,4])\n",
"b=np.unique(a,return_counts=True)\n",
"print(b[0][list(b[1]).index(1)])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.193px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,940 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 数组操作\n",
"\n",
"## 更改形状\n",
"\n",
"在对数组进行操作时,为了满足格式和计算的要求通常会改变其形状。\n",
"\n",
"- `numpy.ndarray.shape`表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 `ndim` 属性(秩)。\n",
"\n",
"【例】通过修改 shap 属性来改变数组的形状。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 9, 4, 5, 6, 7, 8])\n",
"print(x.shape) # (8,)\n",
"x.shape = [2, 4]\n",
"print(x)\n",
"# [[1 2 9 4]\n",
"# [5 6 7 8]]\n",
"```\n",
"\n",
"- `numpy.ndarray.flat` 将数组转换为一维的迭代器可以用for访问数组每一个元素。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x.flat\n",
"print(y)\n",
"# <numpy.flatiter object at 0x0000020F9BA10C60>\n",
"for i in y:\n",
" print(i, end=' ')\n",
"# 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35\n",
"\n",
"y[3] = 0\n",
"print(end='\\n')\n",
"print(x)\n",
"# [[11 12 13 0 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"```\n",
"\n",
"- `numpy.ndarray.flatten([order='C'])` 将数组的副本转换为一维数组,并返回。\n",
" - order'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'k' -- 元素在内存中的出现顺序。(简记)\n",
" - order{'C / F'AK}可选使用此索引顺序读取a的元素。'C'意味着以行大的C风格顺序对元素进行索引最后一个轴索引会更改F表示以列大的Fortran样式顺序索引元素其中第一个索引变化最快最后一个索引变化最快。请注意'C'和'F'选项不考虑基础数组的内存布局,仅引用轴索引的顺序.A'表示如果a为Fortran则以类似Fortran的索引顺序读取元素在内存中连续否则类似C的顺序。“ K”表示按照步序在内存中的顺序读取元素但步幅为负时反转数据除外。默认情况下使用Cindex顺序。\n",
"\n",
"【例】`flatten()`函数返回的是拷贝。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x.flatten()\n",
"print(y)\n",
"# [11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34\n",
"# 35]\n",
"\n",
"y[3] = 0\n",
"print(x)\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = x.flatten(order='F')\n",
"print(y)\n",
"# [11 16 21 26 31 12 17 22 27 32 13 18 23 28 33 14 19 24 29 34 15 20 25 30\n",
"# 35]\n",
"\n",
"y[3] = 0\n",
"print(x)\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"```\n",
"\n",
"\n",
"\n",
"- `numpy.ravel(a, order='C')`Return a contiguous flattened array.\n",
"\n",
"【例】`ravel()`返回的是视图。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.ravel(x)\n",
"print(y)\n",
"# [11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34\n",
"# 35]\n",
"\n",
"y[3] = 0\n",
"print(x)\n",
"# [[11 12 13 0 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"\n",
"【例】order=F 就是拷贝\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.ravel(x, order='F')\n",
"print(y)\n",
"# [11 16 21 26 31 12 17 22 27 32 13 18 23 28 33 14 19 24 29 34 15 20 25 30\n",
"# 35]\n",
"\n",
"y[3] = 0\n",
"print(x)\n",
"# [[11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [31 32 33 34 35]]\n",
"```\n",
"\n",
"- `numpy.reshape(a, newshape[, order='C'])`在不更改数据的情况下为数组赋予新的形状。\n",
"\n",
"【例】`reshape()`函数当参数`newshape = [rows,-1]`时,将根据行数自动确定列数。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(12)\n",
"y = np.reshape(x, [3, 4])\n",
"print(y.dtype) # int32\n",
"print(y)\n",
"# [[ 0 1 2 3]\n",
"# [ 4 5 6 7]\n",
"# [ 8 9 10 11]]\n",
"\n",
"y = np.reshape(x, [3, -1])\n",
"print(y)\n",
"# [[ 0 1 2 3]\n",
"# [ 4 5 6 7]\n",
"# [ 8 9 10 11]]\n",
"\n",
"y = np.reshape(x,[-1,3])\n",
"print(y)\n",
"# [[ 0 1 2]\n",
"# [ 3 4 5]\n",
"# [ 6 7 8]\n",
"# [ 9 10 11]]\n",
"\n",
"y[0, 1] = 10\n",
"print(x)\n",
"# [ 0 10 2 3 4 5 6 7 8 9 10 11]改变x去reshape后y中的值x对应元素也改变\n",
"```\n",
"\n",
"【例】`reshape()`函数当参数`newshape = -1`时,表示将数组降为一维。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.randint(12, size=[2, 2, 3])\n",
"print(x)\n",
"# [[[11 9 1]\n",
"# [ 1 10 3]]\n",
"# \n",
"# [[ 0 6 1]\n",
"# [ 4 11 3]]]\n",
"y = np.reshape(x, -1)\n",
"print(y)\n",
"# [11 9 1 1 10 3 0 6 1 4 11 3]\n",
"```\n",
"\n",
"\n",
"\n",
"## 数组转置\n",
"\n",
"\n",
"- `numpy.transpose(a, axes=None)` Permute the dimensions of an array.\n",
"- `numpy.ndarray.T` Same as `self.transpose()`, except that self is returned if `self.ndim < 2`.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.rand(5, 5) * 10\n",
"x = np.around(x, 2)\n",
"print(x)\n",
"# [[6.74 8.46 6.74 5.45 1.25]\n",
"# [3.54 3.49 8.62 1.94 9.92]\n",
"# [5.03 7.22 1.6 8.7 0.43]\n",
"# [7.5 7.31 5.69 9.67 7.65]\n",
"# [1.8 9.52 2.78 5.87 4.14]]\n",
"y = x.T\n",
"print(y)\n",
"# [[6.74 3.54 5.03 7.5 1.8 ]\n",
"# [8.46 3.49 7.22 7.31 9.52]\n",
"# [6.74 8.62 1.6 5.69 2.78]\n",
"# [5.45 1.94 8.7 9.67 5.87]\n",
"# [1.25 9.92 0.43 7.65 4.14]]\n",
"y = np.transpose(x)\n",
"print(y)\n",
"# [[6.74 3.54 5.03 7.5 1.8 ]\n",
"# [8.46 3.49 7.22 7.31 9.52]\n",
"# [6.74 8.62 1.6 5.69 2.78]\n",
"# [5.45 1.94 8.7 9.67 5.87]\n",
"# [1.25 9.92 0.43 7.65 4.14]]\n",
"```\n",
"\n",
"\n",
"## 更改维度\n",
"\n",
"当创建一个数组之后,还可以给它增加一个维度,这在矩阵计算中经常会用到。\n",
"\n",
"- `numpy.newaxis = None` `None`的别名,对索引数组很有用。\n",
"\n",
"【例】很多工具包在进行计算时都会先判断输入数据的维度是否满足要求,如果输入数据达不到指定的维度时,可以使用`newaxis`参数来增加一个维度。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 9, 4, 5, 6, 7, 8])\n",
"print(x.shape) # (8,)\n",
"print(x) # [1 2 9 4 5 6 7 8]\n",
"\n",
"y = x[np.newaxis, :]\n",
"print(y.shape) # (1, 8)\n",
"print(y) # [[1 2 9 4 5 6 7 8]]\n",
"\n",
"y = x[:, np.newaxis]\n",
"print(y.shape) # (8, 1)\n",
"print(y)\n",
"# [[1]\n",
"# [2]\n",
"# [9]\n",
"# [4]\n",
"# [5]\n",
"# [6]\n",
"# [7]\n",
"# [8]]\n",
"```\n",
"\n",
"- `numpy.squeeze(a, axis=None)` 从数组的形状中删除单维度条目即把shape中为1的维度去掉。\n",
" - `a`表示输入的数组;\n",
" - `axis`用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;\n",
"\n",
"在机器学习和深度学习中,通常算法的结果是可以表示向量的数组(即包含两对或以上的方括号形式[[]]),如果直接利用这个数组进行画图可能显示界面为空(见后面的示例)。我们可以利用`squeeze()`函数将表示向量的数组转换为秩为1的数组这样利用 matplotlib 库函数画图时,就可以正常的显示结果了。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(10)\n",
"print(x.shape) # (10,)\n",
"x = x[np.newaxis, :]\n",
"print(x.shape) # (1, 10)\n",
"y = np.squeeze(x)\n",
"print(y.shape) # (10,)\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[[0], [1], [2]]])\n",
"print(x.shape) # (1, 3, 1)\n",
"print(x)\n",
"# [[[0]\n",
"# [1]\n",
"# [2]]]\n",
"\n",
"y = np.squeeze(x)\n",
"print(y.shape) # (3,)\n",
"print(y) # [0 1 2]\n",
"\n",
"y = np.squeeze(x, axis=0)\n",
"print(y.shape) # (3, 1)\n",
"print(y)\n",
"# [[0]\n",
"# [1]\n",
"# [2]]\n",
"\n",
"y = np.squeeze(x, axis=2)\n",
"print(y.shape) # (1, 3)\n",
"print(y) # [[0 1 2]]\n",
"\n",
"y = np.squeeze(x, axis=1)\n",
"# ValueError: cannot select an axis to squeeze out which has size not equal to one\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"x = np.array([[1, 4, 9, 16, 25]])\n",
"print(x.shape) # (1, 5)\n",
"plt.plot(x)\n",
"plt.show()\n",
"```\n",
"![](https://img-blog.csdnimg.cn/20200528095957317.png)\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"x = np.array([[1, 4, 9, 16, 25]])\n",
"x = np.squeeze(x)\n",
"print(x.shape) # (5, )\n",
"plt.plot(x)\n",
"plt.show()\n",
"```\n",
"\n",
"![](https://img-blog.csdnimg.cn/20200528100221464.png)\n",
"\n",
"## 数组组合\n",
"\n",
"如果要将两份数据组合到一起,就需要拼接操作。\n",
"\n",
"- `numpy.concatenate((a1, a2, ...), axis=0, out=None)` Join a sequence of arrays along an existing axis.\n",
"\n",
"【例】连接沿现有轴的数组序列原来xy都是一维的拼接后的结果也是一维的。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3])\n",
"y = np.array([7, 8, 9])\n",
"z = np.concatenate([x, y])\n",
"print(z)\n",
"# [1 2 3 7 8 9]\n",
"\n",
"z = np.concatenate([x, y], axis=0)\n",
"print(z)\n",
"# [1 2 3 7 8 9]\n",
"```\n",
"\n",
"【例】原来xy都是二维的拼接后的结果也是二维的。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3]).reshape(1, 3)\n",
"y = np.array([7, 8, 9]).reshape(1, 3)\n",
"z = np.concatenate([x, y])\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 7 8 9]]\n",
"z = np.concatenate([x, y], axis=0)\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 7 8 9]]\n",
"z = np.concatenate([x, y], axis=1)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]]\n",
"```\n",
"\n",
"【例】xy在原来的维度上进行拼接。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.array([[7, 8, 9], [10, 11, 12]])\n",
"z = np.concatenate([x, y])\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 4 5 6]\n",
"# [ 7 8 9]\n",
"# [10 11 12]]\n",
"z = np.concatenate([x, y], axis=0)\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 4 5 6]\n",
"# [ 7 8 9]\n",
"# [10 11 12]]\n",
"z = np.concatenate([x, y], axis=1)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]\n",
"# [ 4 5 6 10 11 12]]\n",
"```\n",
"\n",
"- `numpy.stack(arrays, axis=0, out=None)`Join a sequence of arrays along a new axis.\n",
"\n",
"\n",
"【例】沿着新的轴加入一系列数组stack为增加维度的拼接。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3])\n",
"y = np.array([7, 8, 9])\n",
"z = np.stack([x, y])\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.stack([x, y], axis=1)\n",
"print(z.shape) # (3, 2)\n",
"print(z)\n",
"# [[1 7]\n",
"# [2 8]\n",
"# [3 9]]\n",
"```\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3]).reshape(1, 3)\n",
"y = np.array([7, 8, 9]).reshape(1, 3)\n",
"z = np.stack([x, y])\n",
"print(z.shape) # (2, 1, 3)\n",
"print(z)\n",
"# [[[1 2 3]]\n",
"#\n",
"# [[7 8 9]]]\n",
"\n",
"z = np.stack([x, y], axis=1)\n",
"print(z.shape) # (1, 2, 3)\n",
"print(z)\n",
"# [[[1 2 3]\n",
"# [7 8 9]]]\n",
"\n",
"z = np.stack([x, y], axis=2)\n",
"print(z.shape) # (1, 3, 2)\n",
"print(z)\n",
"# [[[1 7]\n",
"# [2 8]\n",
"# [3 9]]]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.array([[7, 8, 9], [10, 11, 12]])\n",
"z = np.stack([x, y])\n",
"print(z.shape) # (2, 2, 3)\n",
"print(z)\n",
"# [[[ 1 2 3]\n",
"# [ 4 5 6]]\n",
"# \n",
"# [[ 7 8 9]\n",
"# [10 11 12]]]\n",
"\n",
"z = np.stack([x, y], axis=1)\n",
"print(z.shape) # (2, 2, 3)\n",
"print(z)\n",
"# [[[ 1 2 3]\n",
"# [ 7 8 9]]\n",
"# \n",
"# [[ 4 5 6]\n",
"# [10 11 12]]]\n",
"\n",
"z = np.stack([x, y], axis=2)\n",
"print(z.shape) # (2, 3, 2)\n",
"print(z)\n",
"# [[[ 1 7]\n",
"# [ 2 8]\n",
"# [ 3 9]]\n",
"# \n",
"# [[ 4 10]\n",
"# [ 5 11]\n",
"# [ 6 12]]]\n",
"```\n",
"\n",
"\n",
"- `numpy.vstack(tup)`Stack arrays in sequence vertically (row wise).\n",
"- `numpy.hstack(tup)`Stack arrays in sequence horizontally (column wise). \n",
"\n",
"\n",
"【例】一维的情况。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3])\n",
"y = np.array([7, 8, 9])\n",
"z = np.vstack((x, y))\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.stack([x, y])\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.hstack((x, y))\n",
"print(z.shape) # (6,)\n",
"print(z)\n",
"# [1 2 3 7 8 9]\n",
"\n",
"z = np.concatenate((x, y))\n",
"print(z.shape) # (6,)\n",
"print(z) # [1 2 3 7 8 9]\n",
"```\n",
"\n",
"\n",
"\n",
"【例】二维的情况。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3]).reshape(1, 3)\n",
"y = np.array([7, 8, 9]).reshape(1, 3)\n",
"z = np.vstack((x, y))\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.concatenate((x, y), axis=0)\n",
"print(z.shape) # (2, 3)\n",
"print(z)\n",
"# [[1 2 3]\n",
"# [7 8 9]]\n",
"\n",
"z = np.hstack((x, y))\n",
"print(z.shape) # (1, 6)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]]\n",
"\n",
"z = np.concatenate((x, y), axis=1)\n",
"print(z.shape) # (1, 6)\n",
"print(z)\n",
"# [[1 2 3 7 8 9]]\n",
"```\n",
"\n",
"【例】二维的情况。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6]])\n",
"y = np.array([[7, 8, 9], [10, 11, 12]])\n",
"z = np.vstack((x, y))\n",
"print(z.shape) # (4, 3)\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 4 5 6]\n",
"# [ 7 8 9]\n",
"# [10 11 12]]\n",
"\n",
"z = np.concatenate((x, y), axis=0)\n",
"print(z.shape) # (4, 3)\n",
"print(z)\n",
"# [[ 1 2 3]\n",
"# [ 4 5 6]\n",
"# [ 7 8 9]\n",
"# [10 11 12]]\n",
"\n",
"z = np.hstack((x, y))\n",
"print(z.shape) # (2, 6)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]\n",
"# [ 4 5 6 10 11 12]]\n",
"\n",
"z = np.concatenate((x, y), axis=1)\n",
"print(z.shape) # (2, 6)\n",
"print(z)\n",
"# [[ 1 2 3 7 8 9]\n",
"# [ 4 5 6 10 11 12]]\n",
"```\n",
"\n",
"`hstack(),vstack()`分别表示水平和竖直的拼接方式。在数据维度等于1时比较特殊。而当维度大于或等于2时它们的作用相当于`concatenate`,用于在已有轴上进行操作。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.hstack([np.array([1, 2, 3, 4]), 5])\n",
"print(a) # [1 2 3 4 5]\n",
"\n",
"a = np.concatenate([np.array([1, 2, 3, 4]), 5])\n",
"print(a)\n",
"# all the input arrays must have same number of dimensions, but the array at index 0 has 1 dimension(s) and the array at index 1 has 0 dimension(s)\n",
"```\n",
"\n",
"\n",
"## 数组拆分\n",
"\n",
"- `numpy.split(ary, indices_or_sections, axis=0)` Split an array into multiple sub-arrays as views into ary.\n",
"\n",
"【例】拆分数组。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14],\n",
" [16, 17, 18, 19],\n",
" [21, 22, 23, 24]])\n",
"y = np.split(x, [1, 3])\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]\n",
"\n",
"y = np.split(x, [1, 3], axis=1)\n",
"print(y)\n",
"# [array([[11],\n",
"# [16],\n",
"# [21]]), array([[12, 13],\n",
"# [17, 18],\n",
"# [22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"```\n",
"\n",
"\n",
"\n",
"- `numpy.vsplit(ary, indices_or_sections)` Split an array into multiple sub-arrays vertically (row-wise).\n",
"\n",
"【例】垂直切分是把数组按照高度切分\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14],\n",
" [16, 17, 18, 19],\n",
" [21, 22, 23, 24]])\n",
"y = np.vsplit(x, 3)\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19]]), array([[21, 22, 23, 24]])]\n",
"\n",
"y = np.split(x, 3)\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19]]), array([[21, 22, 23, 24]])]\n",
"\n",
"\n",
"y = np.vsplit(x, [1])\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]])]\n",
"\n",
"y = np.split(x, [1])\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]])]\n",
"\n",
"\n",
"y = np.vsplit(x, [1, 3])\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]\n",
"y = np.split(x, [1, 3], axis=0)\n",
"print(y)\n",
"# [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19],\n",
"# [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)]\n",
"```\n",
"\n",
"- `numpy.hsplit(ary, indices_or_sections)` Split an array into multiple sub-arrays horizontally (column-wise).\n",
"\n",
"\n",
"【例】水平切分是把数组按照宽度切分。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14],\n",
" [16, 17, 18, 19],\n",
" [21, 22, 23, 24]])\n",
"y = np.hsplit(x, 2)\n",
"print(y)\n",
"# [array([[11, 12],\n",
"# [16, 17],\n",
"# [21, 22]]), array([[13, 14],\n",
"# [18, 19],\n",
"# [23, 24]])]\n",
"\n",
"y = np.split(x, 2, axis=1)\n",
"print(y)\n",
"# [array([[11, 12],\n",
"# [16, 17],\n",
"# [21, 22]]), array([[13, 14],\n",
"# [18, 19],\n",
"# [23, 24]])]\n",
"\n",
"y = np.hsplit(x, [3])\n",
"print(y)\n",
"# [array([[11, 12, 13],\n",
"# [16, 17, 18],\n",
"# [21, 22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"\n",
"y = np.split(x, [3], axis=1)\n",
"print(y)\n",
"# [array([[11, 12, 13],\n",
"# [16, 17, 18],\n",
"# [21, 22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"\n",
"y = np.hsplit(x, [1, 3])\n",
"print(y)\n",
"# [array([[11],\n",
"# [16],\n",
"# [21]]), array([[12, 13],\n",
"# [17, 18],\n",
"# [22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"\n",
"y = np.split(x, [1, 3], axis=1)\n",
"print(y)\n",
"# [array([[11],\n",
"# [16],\n",
"# [21]]), array([[12, 13],\n",
"# [17, 18],\n",
"# [22, 23]]), array([[14],\n",
"# [19],\n",
"# [24]])]\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"## 数组平铺\n",
"\n",
"- `numpy.tile(A, reps)` Construct an array by repeating A the number of times given by reps.\n",
"\n",
"`tile`是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来。\n",
"\n",
"【例】将原矩阵横向、纵向地复制。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2], [3, 4]])\n",
"print(x)\n",
"# [[1 2]\n",
"# [3 4]]\n",
"\n",
"y = np.tile(x, (1, 3))\n",
"print(y)\n",
"# [[1 2 1 2 1 2]\n",
"# [3 4 3 4 3 4]]\n",
"\n",
"y = np.tile(x, (3, 1))\n",
"print(y)\n",
"# [[1 2]\n",
"# [3 4]\n",
"# [1 2]\n",
"# [3 4]\n",
"# [1 2]\n",
"# [3 4]]\n",
"\n",
"y = np.tile(x, (3, 3))\n",
"print(y)\n",
"# [[1 2 1 2 1 2]\n",
"# [3 4 3 4 3 4]\n",
"# [1 2 1 2 1 2]\n",
"# [3 4 3 4 3 4]\n",
"# [1 2 1 2 1 2]\n",
"# [3 4 3 4 3 4]]\n",
"```\n",
"\n",
"- `numpy.repeat(a, repeats, axis=None)` Repeat elements of an array.\n",
" - `axis=0`沿着y轴复制实际上增加了行数。\n",
" - `axis=1`沿着x轴复制实际上增加了列数。\n",
" - `repeats`,可以为一个数,也可以为一个矩阵。\n",
" - `axis=None`时就会flatten当前矩阵实际上就是变成了一个行向量。\n",
"\n",
"【例】重复数组的元素。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.repeat(3, 4)\n",
"print(x) # [3 3 3 3]\n",
"\n",
"x = np.array([[1, 2], [3, 4]])\n",
"y = np.repeat(x, 2)\n",
"print(y)\n",
"# [1 1 2 2 3 3 4 4]\n",
"\n",
"y = np.repeat(x, 2, axis=0)\n",
"print(y)\n",
"# [[1 2]\n",
"# [1 2]\n",
"# [3 4]\n",
"# [3 4]]\n",
"\n",
"y = np.repeat(x, 2, axis=1)\n",
"print(y)\n",
"# [[1 1 2 2]\n",
"# [3 3 4 4]]\n",
"\n",
"y = np.repeat(x, [2, 3], axis=0)\n",
"print(y)\n",
"# [[1 2]\n",
"# [1 2]\n",
"# [3 4]\n",
"# [3 4]\n",
"# [3 4]]\n",
"\n",
"y = np.repeat(x, [2, 3], axis=1)\n",
"print(y)\n",
"# [[1 1 2 2 2]\n",
"# [3 3 4 4 4]]\n",
"```\n",
"\n",
"---\n",
"## 添加和删除元素\n",
"\n",
"- `numpy.unique(ar, return_index=False, return_inverse=False,return_counts=False, axis=None)` Find the unique elements of an array.\n",
" - return_indexthe indices of the input array that give the unique values\n",
" - return_inversethe indices of the unique array that reconstruct the input array\n",
" - return_countsthe number of times each unique value comes up in the input array\n",
"\n",
"\n",
"\n",
"\n",
"【例】查找数组的唯一元素。\n",
"```python\n",
"a=np.array([1,1,2,3,3,4,4])\n",
"b=np.unique(a,return_counts=True)\n",
"print(b[0][list(b[1]).index(1)])\n",
"#2\n",
"```\n",
"\n",
"---\n",
"**参考文献**\n",
"- https://blog.csdn.net/csdn15698845876/article/details/73380803\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"ExecuteTime": {
"end_time": "2020-08-30T13:01:49.899843Z",
"start_time": "2020-08-30T13:01:49.895853Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n"
]
}
],
"source": [
"a=np.array([1,1,2,3,3,4,4])\n",
"b=np.unique(a,return_counts=True)\n",
"print(b[0][list(b[1]).index(1)])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.193px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,309 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**将 `arr`转换为2行的2维数组。**\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:数组的操作】\n",
"- 如何改变数组的形状?"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:47:23.972422Z",
"start_time": "2020-09-06T02:47:23.965489Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2 3 4]\n",
" [5 6 7 8 9]]\n",
"[[0 1 2 3 4]\n",
" [5 6 7 8 9]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"arr = np.arange(10)\n",
"\n",
"# 方法1\n",
"x = np.reshape(arr, newshape=[2, 5])\n",
"print(x)\n",
"# [[0 1 2 3 4]\n",
"# [5 6 7 8 9]]\n",
"\n",
"# 方法2\n",
"x = np.reshape(arr, newshape=[2, -1])\n",
"print(x)\n",
"# [[0 1 2 3 4]\n",
"# [5 6 7 8 9]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**垂直堆叠数组a和数组b。**\n",
"- `a = np.arange(10).reshape([2, -1])`\n",
"- `b = np.repeat(1, 10).reshape([2, -1])`\n",
"\n",
"【知识点:数组操作】\n",
"- 如何垂直叠加两个数组?"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:48:08.620475Z",
"start_time": "2020-09-06T02:48:08.614519Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2 3 4]\n",
" [5 6 7 8 9]]\n",
"[[1 1 1 1 1]\n",
" [1 1 1 1 1]]\n",
"[[0 1 2 3 4]\n",
" [5 6 7 8 9]\n",
" [1 1 1 1 1]\n",
" [1 1 1 1 1]]\n",
"[[0 1 2 3 4]\n",
" [5 6 7 8 9]\n",
" [1 1 1 1 1]\n",
" [1 1 1 1 1]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.arange(10).reshape([2, -1])\n",
"b = np.repeat(1, 10).reshape([2, -1])\n",
"\n",
"print(a)\n",
"# [[0 1 2 3 4]\n",
"# [5 6 7 8 9]]\n",
"print(b)\n",
"# [[1 1 1 1 1]\n",
"# [1 1 1 1 1]]\n",
"\n",
"# 方法1\n",
"print(np.concatenate([a, b], axis=0))\n",
"# [[0 1 2 3 4]\n",
"# [5 6 7 8 9]\n",
"# [1 1 1 1 1]\n",
"# [1 1 1 1 1]]\n",
"\n",
"# 方法2\n",
"print(np.vstack([a, b]))\n",
"# [[0 1 2 3 4]\n",
"# [5 6 7 8 9]\n",
"# [1 1 1 1 1]\n",
"# [1 1 1 1 1]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**8. 将数组a与数组b水平堆叠。**\n",
"- `a = np.arange(10).reshape([2, -1])`\n",
"- `b = np.repeat(1, 10).reshape([2, -1])`\n",
"\n",
"【知识点:数组的操作】\n",
"- 如何水平叠加两个数组?"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:48:41.235432Z",
"start_time": "2020-09-06T02:48:41.229447Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2 3 4]\n",
" [5 6 7 8 9]]\n",
"[[1 1 1 1 1]\n",
" [1 1 1 1 1]]\n",
"[[0 1 2 3 4 1 1 1 1 1]\n",
" [5 6 7 8 9 1 1 1 1 1]]\n",
"[[0 1 2 3 4 1 1 1 1 1]\n",
" [5 6 7 8 9 1 1 1 1 1]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.arange(10).reshape([2, -1])\n",
"b = np.repeat(1, 10).reshape([2, -1])\n",
"\n",
"print(a)\n",
"# [[0 1 2 3 4]\n",
"# [5 6 7 8 9]]\n",
"print(b)\n",
"# [[1 1 1 1 1]\n",
"# [1 1 1 1 1]]\n",
"\n",
"# 方法1\n",
"print(np.concatenate([a, b], axis=1))\n",
"# [[0 1 2 3 4 1 1 1 1 1]\n",
"# [5 6 7 8 9 1 1 1 1 1]]\n",
"\n",
"# 方法2\n",
"print(np.hstack([a, b]))\n",
"# [[0 1 2 3 4 1 1 1 1 1]\n",
"# [5 6 7 8 9 1 1 1 1 1]]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:15:03.024776Z",
"start_time": "2020-09-06T03:15:03.019739Z"
}
},
"source": [
"**在给定的numpy数组中找到重复的条目第二次出现以后并将它们标记为True。第一次出现应为False。**\n",
"\n",
"- `a = np.random.randint(0, 5, 10)`\n",
"\n",
"【知识点:数组操作】\n",
"- 如何在numpy数组中找到重复值"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:15:33.059248Z",
"start_time": "2020-09-06T03:15:33.054241Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 0 3 0 2 4 2 2 2 2]\n",
"[False True False True False False True True True True]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"a = np.random.randint(0, 5, 10)\n",
"print(a)\n",
"# [0 0 3 0 2 4 2 2 2 2]\n",
"b = np.full(10, True)\n",
"vals, counts = np.unique(a, return_index=True)\n",
"b[counts] = False\n",
"print(b)\n",
"# [False True False True False False True True True True]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,121 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **将 `arr`转换为2行的2维数组。**\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:数组的操作】\n",
"- 如何改变数组的形状?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **垂直堆叠数组a和数组b。**\n",
"- `a = np.arange(10).reshape([2, -1])`\n",
"- `b = np.repeat(1, 10).reshape([2, -1])`\n",
"\n",
"【知识点:数组操作】\n",
"- 如何垂直叠加两个数组?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **8. 将数组a与数组b水平堆叠。**\n",
"- `a = np.arange(10).reshape([2, -1])`\n",
"- `b = np.repeat(1, 10).reshape([2, -1])`\n",
"\n",
"【知识点:数组的操作】\n",
"- 如何水平叠加两个数组?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **在给定的numpy数组中找到重复的条目第二次出现以后并将它们标记为True。第一次出现应为False。**\n",
"\n",
"- `a = np.random.randint(0, 5, 10)`\n",
"\n",
"【知识点:数组操作】\n",
"- 如何在numpy数组中找到重复值"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,828 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 向量化和广播\n",
"\n",
"向量化和广播这两个概念是 numpy 内部实现的基础。有了向量化编写代码时无需使用显式循环。这些循环实际上不能省略只不过是在内部实现被代码中的其他结构代替。向量化的应用使得代码更简洁可读性更强也可以说使用了向量化方法的代码看上去更“Pythonic”。\n",
"\n",
"广播Broadcasting机制描述了 numpy 如何在算术运算期间处理具有不同形状的数组,让较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。并不是所有的维度都要彼此兼容才符合广播机制的要求,但它们必须满足一定的条件。\n",
"\n",
"若两个数组的各维度兼容,也就是两个数组的每一维等长,或其中一个数组为 一维那么广播机制就适用。如果这两个条件不满足numpy就会抛出异常说两个数组不兼容。\n",
"\n",
"总结来说,广播的规则有三个:\n",
"- 如果两个数组的维度数dim不相同那么小维度数组的形状将会在左边补1。\n",
"- 如果shape维度不匹配但是有维度是1那么可以扩展维度是1的维度匹配另一个数组\n",
"- 如果shape维度不匹配但是没有任何一个维度是1则匹配引发错误\n",
"\n",
"【例】二维数组加一维数组\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(4)\n",
"y = np.ones((3, 4))\n",
"print(x.shape) # (4,)\n",
"print(y.shape) # (3, 4)\n",
"\n",
"print((x + y).shape) # (3, 4)\n",
"print(x + y)\n",
"# [[1. 2. 3. 4.]\n",
"# [1. 2. 3. 4.]\n",
"# [1. 2. 3. 4.]]\n",
"```\n",
"\n",
"\n",
"【例】两个数组均需要广播\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(4).reshape(4, 1)\n",
"y = np.ones(5)\n",
"\n",
"print(x.shape) # (4, 1)\n",
"print(y.shape) # (5,)\n",
"\n",
"print((x + y).shape) # (4, 5)\n",
"print(x + y)\n",
"# [[1. 1. 1. 1. 1.]\n",
"# [2. 2. 2. 2. 2.]\n",
"# [3. 3. 3. 3. 3.]\n",
"# [4. 4. 4. 4. 4.]]\n",
"\n",
"x = np.array([0.0, 10.0, 20.0, 30.0])\n",
"y = np.array([1.0, 2.0, 3.0])\n",
"z = x[:, np.newaxis] + y\n",
"print(z)\n",
"# [[ 1. 2. 3.]\n",
"# [11. 12. 13.]\n",
"# [21. 22. 23.]\n",
"# [31. 32. 33.]]\n",
"```\n",
"\n",
"【例】不匹配报错的例子\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(4)\n",
"y = np.ones(5)\n",
"\n",
"print(x.shape) # (4,)\n",
"print(y.shape) # (5,)\n",
"\n",
"print(x + y)\n",
"# ValueError: operands could not be broadcast together with shapes (4,) (5,) \n",
"```\n",
"\n",
"\n",
"---\n",
"# 数学函数\n",
"\n",
"\n",
"## 算数运算\n",
"### numpy.add\n",
"### numpy.subtract\n",
"### numpy.multiply\n",
"\n",
"- `numpy.add(x1, x2, *args, **kwargs)` Add arguments element-wise.\n",
"- `numpy.subtract(x1, x2, *args, **kwargs)` Subtract arguments element-wise.\n",
"- `numpy.multiply(x1, x2, *args, **kwargs)` Multiply arguments element-wise.\n",
"- `numpy.divide(x1, x2, *args, **kwargs)` Returns a true division of the inputs, element-wise.\n",
"- `numpy.floor_divide(x1, x2, *args, **kwargs)` Return the largest integer smaller or equal to the division of the inputs.\n",
"- `numpy.power(x1, x2, *args, **kwargs)` First array elements raised to powers from second array, element-wise.\n",
"\n",
"在 numpy 中对以上函数进行了运算符的重载,且运算符为 **元素级**。也就是说,它们只用于位置相同的元素之间,所得到的运算结果组成一个新的数组。\n",
"\n",
"【例】注意 numpy 的广播规则。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"y = x + 1\n",
"print(y)\n",
"print(np.add(x, 1))\n",
"# [2 3 4 5 6 7 8 9]\n",
"\n",
"y = x - 1\n",
"print(y)\n",
"print(np.subtract(x, 1))\n",
"# [0 1 2 3 4 5 6 7]\n",
"\n",
"y = x * 2\n",
"print(y)\n",
"print(np.multiply(x, 2))\n",
"# [ 2 4 6 8 10 12 14 16]\n",
"\n",
"y = x / 2\n",
"print(y)\n",
"print(np.divide(x, 2))\n",
"# [0.5 1. 1.5 2. 2.5 3. 3.5 4. ]\n",
"\n",
"y = x // 2\n",
"print(y)\n",
"print(np.floor_divide(x, 2))\n",
"# [0 1 1 2 2 3 3 4]\n",
"\n",
"y = x ** 2\n",
"print(y)\n",
"print(np.power(x, 2))\n",
"# [ 1 4 9 16 25 36 49 64]\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"【例】注意 numpy 的广播规则。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x + 1\n",
"print(y)\n",
"print(np.add(x, 1))\n",
"# [[12 13 14 15 16]\n",
"# [17 18 19 20 21]\n",
"# [22 23 24 25 26]\n",
"# [27 28 29 30 31]\n",
"# [32 33 34 35 36]]\n",
"\n",
"y = x - 1\n",
"print(y)\n",
"print(np.subtract(x, 1))\n",
"# [[10 11 12 13 14]\n",
"# [15 16 17 18 19]\n",
"# [20 21 22 23 24]\n",
"# [25 26 27 28 29]\n",
"# [30 31 32 33 34]]\n",
"\n",
"y = x * 2\n",
"print(y)\n",
"print(np.multiply(x, 2))\n",
"# [[22 24 26 28 30]\n",
"# [32 34 36 38 40]\n",
"# [42 44 46 48 50]\n",
"# [52 54 56 58 60]\n",
"# [62 64 66 68 70]]\n",
"\n",
"y = x / 2\n",
"print(y)\n",
"print(np.divide(x, 2))\n",
"# [[ 5.5 6. 6.5 7. 7.5]\n",
"# [ 8. 8.5 9. 9.5 10. ]\n",
"# [10.5 11. 11.5 12. 12.5]\n",
"# [13. 13.5 14. 14.5 15. ]\n",
"# [15.5 16. 16.5 17. 17.5]]\n",
"\n",
"y = x // 2\n",
"print(y)\n",
"print(np.floor_divide(x, 2))\n",
"# [[ 5 6 6 7 7]\n",
"# [ 8 8 9 9 10]\n",
"# [10 11 11 12 12]\n",
"# [13 13 14 14 15]\n",
"# [15 16 16 17 17]]\n",
"\n",
"y = x ** 2\n",
"print(y)\n",
"print(np.power(x, 2))\n",
"# [[ 121 144 169 196 225]\n",
"# [ 256 289 324 361 400]\n",
"# [ 441 484 529 576 625]\n",
"# [ 676 729 784 841 900]\n",
"# [ 961 1024 1089 1156 1225]]\n",
"```\n",
"\n",
"【例】注意 numpy 的广播规则。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.arange(1, 6)\n",
"print(y)\n",
"# [1 2 3 4 5]\n",
"\n",
"z = x + y\n",
"print(z)\n",
"print(np.add(x, y))\n",
"# [[12 14 16 18 20]\n",
"# [17 19 21 23 25]\n",
"# [22 24 26 28 30]\n",
"# [27 29 31 33 35]\n",
"# [32 34 36 38 40]]\n",
"\n",
"z = x - y\n",
"print(z)\n",
"print(np.subtract(x, y))\n",
"# [[10 10 10 10 10]\n",
"# [15 15 15 15 15]\n",
"# [20 20 20 20 20]\n",
"# [25 25 25 25 25]\n",
"# [30 30 30 30 30]]\n",
"\n",
"z = x * y\n",
"print(z)\n",
"print(np.multiply(x, y))\n",
"# [[ 11 24 39 56 75]\n",
"# [ 16 34 54 76 100]\n",
"# [ 21 44 69 96 125]\n",
"# [ 26 54 84 116 150]\n",
"# [ 31 64 99 136 175]]\n",
"\n",
"z = x / y\n",
"print(z)\n",
"print(np.divide(x, y))\n",
"# [[11. 6. 4.33333333 3.5 3. ]\n",
"# [16. 8.5 6. 4.75 4. ]\n",
"# [21. 11. 7.66666667 6. 5. ]\n",
"# [26. 13.5 9.33333333 7.25 6. ]\n",
"# [31. 16. 11. 8.5 7. ]]\n",
"\n",
"z = x // y\n",
"print(z)\n",
"print(np.floor_divide(x, y))\n",
"# [[11 6 4 3 3]\n",
"# [16 8 6 4 4]\n",
"# [21 11 7 6 5]\n",
"# [26 13 9 7 6]\n",
"# [31 16 11 8 7]]\n",
"\n",
"z = x ** np.full([1, 5], 2)\n",
"print(z)\n",
"print(np.power(x, np.full([5, 5], 2)))\n",
"# [[ 121 144 169 196 225]\n",
"# [ 256 289 324 361 400]\n",
"# [ 441 484 529 576 625]\n",
"# [ 676 729 784 841 900]\n",
"# [ 961 1024 1089 1156 1225]]\n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.arange(1, 26).reshape([5, 5])\n",
"print(y)\n",
"# [[ 1 2 3 4 5]\n",
"# [ 6 7 8 9 10]\n",
"# [11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]]\n",
"\n",
"z = x + y\n",
"print(z)\n",
"print(np.add(x, y))\n",
"# [[12 14 16 18 20]\n",
"# [22 24 26 28 30]\n",
"# [32 34 36 38 40]\n",
"# [42 44 46 48 50]\n",
"# [52 54 56 58 60]]\n",
"\n",
"z = x - y\n",
"print(z)\n",
"print(np.subtract(x, y))\n",
"# [[10 10 10 10 10]\n",
"# [10 10 10 10 10]\n",
"# [10 10 10 10 10]\n",
"# [10 10 10 10 10]\n",
"# [10 10 10 10 10]]\n",
"\n",
"z = x * y\n",
"print(z)\n",
"print(np.multiply(x, y))\n",
"# [[ 11 24 39 56 75]\n",
"# [ 96 119 144 171 200]\n",
"# [231 264 299 336 375]\n",
"# [416 459 504 551 600]\n",
"# [651 704 759 816 875]]\n",
"\n",
"z = x / y\n",
"print(z)\n",
"print(np.divide(x, y))\n",
"# [[11. 6. 4.33333333 3.5 3. ]\n",
"# [ 2.66666667 2.42857143 2.25 2.11111111 2. ]\n",
"# [ 1.90909091 1.83333333 1.76923077 1.71428571 1.66666667]\n",
"# [ 1.625 1.58823529 1.55555556 1.52631579 1.5 ]\n",
"# [ 1.47619048 1.45454545 1.43478261 1.41666667 1.4 ]]\n",
"\n",
"z = x // y\n",
"print(z)\n",
"print(np.floor_divide(x, y))\n",
"# [[11 6 4 3 3]\n",
"# [ 2 2 2 2 2]\n",
"# [ 1 1 1 1 1]\n",
"# [ 1 1 1 1 1]\n",
"# [ 1 1 1 1 1]]\n",
"\n",
"z = x ** np.full([5, 5], 2)\n",
"print(z)\n",
"print(np.power(x, np.full([5, 5], 2)))\n",
"# [[ 121 144 169 196 225]\n",
"# [ 256 289 324 361 400]\n",
"# [ 441 484 529 576 625]\n",
"# [ 676 729 784 841 900]\n",
"# [ 961 1024 1089 1156 1225]]\n",
"```\n",
"\n",
"\n",
"\n",
"- `numpy.sqrt(x, *args, **kwargs)` Return the non-negative square-root of an array, element-wise.\n",
"- `numpy.square(x, *args, **kwargs)` Return the element-wise square of the input.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(1, 5)\n",
"print(x) # [1 2 3 4]\n",
"\n",
"y = np.sqrt(x)\n",
"print(y)\n",
"# [1. 1.41421356 1.73205081 2. ]\n",
"print(np.power(x, 0.5))\n",
"# [1. 1.41421356 1.73205081 2. ]\n",
"\n",
"y = np.square(x)\n",
"print(y)\n",
"# [ 1 4 9 16]\n",
"print(np.power(x, 2))\n",
"# [ 1 4 9 16]\n",
"```\n",
"\n",
"\n",
"---\n",
"## 三角函数\n",
"\n",
"- `numpy.sin(x, *args, **kwargs)` Trigonometric sine, element-wise.\n",
"- `numpy.cos(x, *args, **kwargs)` Cosine element-wise.\n",
"- `numpy.tan(x, *args, **kwargs)` Compute tangent element-wise.\n",
"- `numpy.arcsin(x, *args, **kwargs)` Inverse sine, element-wise.\n",
"- `numpy.arccos(x, *args, **kwargs)` Trigonometric inverse cosine, element-wise.\n",
"- `numpy.arctan(x, *args, **kwargs)` Trigonometric inverse tangent, element-wise.\n",
"\n",
"\n",
"**通用函数**universal function通常叫作ufunc它对数组中的各个元素逐一进行操作。这表明通用函数分别处理输入数组的每个元素生成的结果组成一个新的输出数组。输出数组的大小跟输入数组相同。\n",
"\n",
"三角函数等很多数学运算符合通用函数的定义,例如,计算平方根的`sqrt()`函数、用来取对数的`log()`函数和求正弦值的`sin()`函数。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.linspace(start=0, stop=np.pi / 2, num=10)\n",
"print(x)\n",
"# [0. 0.17453293 0.34906585 0.52359878 0.6981317 0.87266463\n",
"# 1.04719755 1.22173048 1.3962634 1.57079633]\n",
"\n",
"y = np.sin(x)\n",
"print(y)\n",
"# [0. 0.17364818 0.34202014 0.5 0.64278761 0.76604444\n",
"# 0.8660254 0.93969262 0.98480775 1. ]\n",
"\n",
"z = np.arcsin(y)\n",
"print(z)\n",
"# [0. 0.17453293 0.34906585 0.52359878 0.6981317 0.87266463\n",
"# 1.04719755 1.22173048 1.3962634 1.57079633]\n",
"\n",
"y = np.cos(x)\n",
"print(y)\n",
"# [1.00000000e+00 9.84807753e-01 9.39692621e-01 8.66025404e-01\n",
"# 7.66044443e-01 6.42787610e-01 5.00000000e-01 3.42020143e-01\n",
"# 1.73648178e-01 6.12323400e-17]\n",
"\n",
"z = np.arccos(y)\n",
"print(z)\n",
"# [0. 0.17453293 0.34906585 0.52359878 0.6981317 0.87266463\n",
"# 1.04719755 1.22173048 1.3962634 1.57079633]\n",
"\n",
"y = np.tan(x)\n",
"print(y)\n",
"# [0.00000000e+00 1.76326981e-01 3.63970234e-01 5.77350269e-01\n",
"# 8.39099631e-01 1.19175359e+00 1.73205081e+00 2.74747742e+00\n",
"# 5.67128182e+00 1.63312394e+16]\n",
"\n",
"z = np.arctan(y)\n",
"print(z)\n",
"# [0. 0.17453293 0.34906585 0.52359878 0.6981317 0.87266463\n",
"# 1.04719755 1.22173048 1.3962634 1.57079633]\n",
"```\n",
"\n",
"---\n",
"## 指数和对数\n",
"\n",
"- `numpy.exp(x, *args, **kwargs)` Calculate the exponential of all elements in the input array.\n",
"- `numpy.log(x, *args, **kwargs)` Natural logarithm, element-wise.\n",
"- `numpy.exp2(x, *args, **kwargs)` Calculate `2**p` for all `p` in the input array.\n",
"- `numpy.log2(x, *args, **kwargs)` Base-2 logarithm of `x`.\n",
"- `numpy.log10(x, *args, **kwargs)` Return the base 10 logarithm of the input array, element-wise.\n",
"\n",
"\n",
"\n",
"\n",
"【例】The natural logarithm `log` is the inverse of the exponential function, so that `log(exp(x)) = x`. The natural logarithm is logarithm in base `e`.\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(1, 5)\n",
"print(x)\n",
"# [1 2 3 4]\n",
"y = np.exp(x)\n",
"print(y)\n",
"# [ 2.71828183 7.3890561 20.08553692 54.59815003]\n",
"z = np.log(y)\n",
"print(z)\n",
"# [1. 2. 3. 4.]\n",
"```\n",
"\n",
"\n",
"\n",
"---\n",
"## 加法函数、乘法函数\n",
"\n",
"- `numpy.sum(a[, axis=None, dtype=None, out=None, …])` Sum of array elements over a given axis.\n",
"\n",
"通过不同的 `axis`numpy 会沿着不同的方向进行操作:如果不设置,那么对所有的元素操作;如果`axis=0`,则沿着纵轴进行操作;`axis=1`,则沿着横轴进行操作。但这只是简单的二位数组,如果是多维的呢?可以总结为一句话:设`axis=i`,则 numpy 沿着第`i`个下标变化的方向进行操作。\n",
"\n",
"- `numpy.cumsum(a, axis=None, dtype=None, out=None)` Return the cumulative sum of the elements along a given axis.\n",
"\n",
"**聚合函数** 是指对一组值(比如一个数组)进行操作,返回一个单一值作为结果的函数。因而,求数组所有元素之和的函数就是聚合函数。`ndarray`类实现了多个这样的函数。\n",
"\n",
"【例】返回给定轴上的数组元素的总和。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.sum(x)\n",
"print(y) # 575\n",
"\n",
"y = np.sum(x, axis=0)\n",
"print(y) # [105 110 115 120 125]\n",
"\n",
"y = np.sum(x, axis=1)\n",
"print(y) # [ 65 90 115 140 165]\n",
"```\n",
"\n",
"\n",
"【例】返回给定轴上的数组元素的累加和。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.cumsum(x)\n",
"print(y)\n",
"# [ 11 23 36 50 65 81 98 116 135 155 176 198 221 245 270 296 323 351\n",
"# 380 410 441 473 506 540 575]\n",
"\n",
"y = np.cumsum(x, axis=0)\n",
"print(y)\n",
"# [[ 11 12 13 14 15]\n",
"# [ 27 29 31 33 35]\n",
"# [ 48 51 54 57 60]\n",
"# [ 74 78 82 86 90]\n",
"# [105 110 115 120 125]]\n",
"\n",
"y = np.cumsum(x, axis=1)\n",
"print(y)\n",
"# [[ 11 23 36 50 65]\n",
"# [ 16 33 51 70 90]\n",
"# [ 21 43 66 90 115]\n",
"# [ 26 53 81 110 140]\n",
"# [ 31 63 96 130 165]]\n",
"```\n",
"\n",
"- `numpy.prod(a[, axis=None, dtype=None, out=None, …])` Return the product of array elements over a given axis.\n",
"\n",
"\n",
"- `numpy.cumprod(a, axis=None, dtype=None, out=None)` Return the cumulative product of elements along a given axis.\n",
"\n",
"【例】返回给定轴上数组元素的乘积。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.prod(x)\n",
"print(y) # 788529152\n",
"\n",
"y = np.prod(x, axis=0)\n",
"print(y)\n",
"# [2978976 3877632 4972968 6294624 7875000]\n",
"\n",
"y = np.prod(x, axis=1)\n",
"print(y)\n",
"# [ 360360 1860480 6375600 17100720 38955840]\n",
"```\n",
"\n",
"\n",
"【例】返回给定轴上数组元素的累乘。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.cumprod(x)\n",
"print(y)\n",
"# [ 11 132 1716 24024 360360 5765760\n",
"# 98017920 1764322560 -837609728 427674624 391232512 17180672\n",
"# 395155456 893796352 870072320 1147043840 905412608 -418250752\n",
"# 755630080 1194065920 -1638662144 -897581056 444596224 -2063597568\n",
"# 788529152]\n",
"\n",
"y = np.cumprod(x, axis=0)\n",
"print(y)\n",
"# [[ 11 12 13 14 15]\n",
"# [ 176 204 234 266 300]\n",
"# [ 3696 4488 5382 6384 7500]\n",
"# [ 96096 121176 150696 185136 225000]\n",
"# [2978976 3877632 4972968 6294624 7875000]]\n",
"\n",
"y = np.cumprod(x, axis=1)\n",
"print(y)\n",
"# [[ 11 132 1716 24024 360360]\n",
"# [ 16 272 4896 93024 1860480]\n",
"# [ 21 462 10626 255024 6375600]\n",
"# [ 26 702 19656 570024 17100720]\n",
"# [ 31 992 32736 1113024 38955840]]\n",
"```\n",
"\n",
"- `numpy.diff(a, n=1, axis=-1, prepend=np._NoValue, append=np._NoValue)` Calculate the n-th discrete difference along the given axis.\n",
" - a输入矩阵\n",
" - n可选代表要执行几次差值\n",
" - axis默认是最后一个\n",
"\n",
"\n",
"The first difference is given by `out[i] = a[i+1] - a[i]` along the given axis, higher differences are calculated by using `diff` recursively.\n",
"\n",
"【例】沿着指定轴计算第N维的离散差值。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"A = np.arange(2, 14).reshape((3, 4))\n",
"A[1, 1] = 8\n",
"print(A)\n",
"# [[ 2 3 4 5]\n",
"# [ 6 8 8 9]\n",
"# [10 11 12 13]]\n",
"print(np.diff(A))\n",
"# [[1 1 1]\n",
"# [2 0 1]\n",
"# [1 1 1]]\n",
"print(np.diff(A, axis=0))\n",
"# [[4 5 4 4]\n",
"# [4 3 4 4]]\n",
"```\n",
"\n",
"\n",
"\n",
"---\n",
"## 四舍五入\n",
"\n",
"- `numpy.around(a, decimals=0, out=None)` Evenly round to the given number of decimals.\n",
"\n",
"\n",
"【例】将数组舍入到给定的小数位数。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.rand(3, 3) * 10\n",
"print(x)\n",
"# [[6.59144457 3.78566113 8.15321227]\n",
"# [1.68241475 3.78753332 7.68886328]\n",
"# [2.84255822 9.58106727 7.86678037]]\n",
"\n",
"y = np.around(x)\n",
"print(y)\n",
"# [[ 7. 4. 8.]\n",
"# [ 2. 4. 8.]\n",
"# [ 3. 10. 8.]]\n",
"\n",
"y = np.around(x, decimals=2)\n",
"print(y)\n",
"# [[6.59 3.79 8.15]\n",
"# [1.68 3.79 7.69]\n",
"# [2.84 9.58 7.87]]\n",
"```\n",
"\n",
"- `numpy.ceil(x, *args, **kwargs)` Return the ceiling of the input, element-wise.\n",
"- `numpy.floor(x, *args, **kwargs)` Return the floor of the input, element-wise.\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.rand(3, 3) * 10\n",
"print(x)\n",
"# [[0.67847795 1.33073923 4.53920122]\n",
"# [7.55724676 5.88854047 2.65502046]\n",
"# [8.67640444 8.80110812 5.97528726]]\n",
"\n",
"y = np.ceil(x)\n",
"print(y)\n",
"# [[1. 2. 5.]\n",
"# [8. 6. 3.]\n",
"# [9. 9. 6.]]\n",
"\n",
"y = np.floor(x)\n",
"print(y)\n",
"# [[0. 1. 4.]\n",
"# [7. 5. 2.]\n",
"# [8. 8. 5.]]\n",
"```\n",
"\n",
"---\n",
"## 杂项\n",
"\n",
"- `numpy.clip(a, a_min, a_max, out=None, **kwargs):` Clip (limit) the values in an array.\n",
"\n",
"Given an interval, values outside the interval are clipped to the interval edges. For example, if an interval of `[0, 1]` is specified, values smaller than 0 become 0, and values larger than 1 become 1.\n",
"\n",
"\n",
"【例】裁剪(限制)数组中的值。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.clip(x, a_min=20, a_max=30)\n",
"print(y)\n",
"# [[20 20 20 20 20]\n",
"# [20 20 20 20 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [30 30 30 30 30]]\n",
"```\n",
"\n",
"\n",
"\n",
"- `numpy.absolute(x, *args, **kwargs)` Calculate the absolute value element-wise. \n",
"- `numpy.abs(x, *args, **kwargs)` is a shorthand for this function.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(-5, 5)\n",
"print(x)\n",
"# [-5 -4 -3 -2 -1 0 1 2 3 4]\n",
"\n",
"y = np.abs(x)\n",
"print(y)\n",
"# [5 4 3 2 1 0 1 2 3 4]\n",
"\n",
"y = np.absolute(x)\n",
"print(y)\n",
"# [5 4 3 2 1 0 1 2 3 4]\n",
"```\n",
"\n",
"- `numpy.sign(x, *args, **kwargs)` Returns an element-wise indication of the sign of a number.\n",
"\n",
"【例】\n",
"\n",
"```python\n",
"x = np.arange(-5, 5)\n",
"print(x)\n",
"#[-5 -4 -3 -2 -1 0 1 2 3 4]\n",
"print(np.sign(x))\n",
"#[-1 -1 -1 -1 -1 0 1 1 1 1]\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"---\n",
"**参考文献**\n",
"- https://mp.weixin.qq.com/s/RWsGvvmw4ptf7d8zPIDEJw\n",
"- https://blog.csdn.net/hanshuobest/article/details/78558826?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-08-30T17:00:33.199734Z",
"start_time": "2020-08-30T17:00:33.194782Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-5 -4 -3 -2 -1 0 1 2 3 4]\n",
"[-1 -1 -1 -1 -1 0 1 1 1 1]\n"
]
}
],
"source": [
"x = np.arange(-5, 5)\n",
"print(x)\n",
"print(np.sign(x))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.2px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,502 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 逻辑函数\n",
"\n",
"## 真值测试\n",
"### numpy.all\n",
"### numpy.any\n",
"\n",
"- `numpy.all(a, axis=None, out=None, keepdims=np._NoValue)` Test whether all array elements along a given axis evaluate to True.\n",
"- `numpy.any(a, axis=None, out=None, keepdims=np._NoValue)` Test whether any array element along a given axis evaluates to True.\n",
"\n",
"\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array([0, 4, 5])\n",
"b = np.copy(a)\n",
"print(np.all(a == b)) # True\n",
"print(np.any(a == b)) # True\n",
"\n",
"b[0] = 1\n",
"print(np.all(a == b)) # False\n",
"print(np.any(a == b)) # True\n",
"\n",
"print(np.all([1.0, np.nan])) # True\n",
"print(np.any([1.0, np.nan])) # True\n",
"\n",
"a = np.eye(3)\n",
"print(np.all(a, axis=0)) # [False False False]\n",
"print(np.any(a, axis=0)) # [ True True True]\n",
"```\n",
"\n",
"\n",
"---\n",
"## 数组内容\n",
"\n",
"- `numpy.isnan(x, *args, **kwargs)` Test element-wise for NaN and return result as a boolean array.\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"a=np.array([1,2,np.nan])\n",
"print(np.isnan(a))\n",
"#[False False True]\n",
"\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"---\n",
"## 逻辑运算\n",
"\n",
"- `numpy.logical_not(x, *args, **kwargs)`Compute the truth value of NOT x element-wise.\n",
"- `numpy.logical_and(x1, x2, *args, **kwargs)` Compute the truth value of x1 AND x2 element-wise.\n",
"- `numpy.logical_or(x1, x2, *args, **kwargs)`Compute the truth value of x1 OR x2 element-wise.\n",
"- `numpy.logical_xor(x1, x2, *args, **kwargs)`Compute the truth value of x1 XOR x2, element-wise.\n",
"\n",
"\n",
"\n",
"\n",
"```python\n",
"【例】计算非x元素的真值。\n",
"\n",
"import numpy as np\n",
"\n",
"print(np.logical_not(3)) \n",
"# False\n",
"print(np.logical_not([True, False, 0, 1]))\n",
"# [False True True False]\n",
"\n",
"x = np.arange(5)\n",
"print(np.logical_not(x < 3))\n",
"# [False False False True True]\n",
"\n",
"【例】计算x1 AND x2元素的真值。\n",
"\n",
"print(np.logical_and(True, False)) \n",
"# False\n",
"print(np.logical_and([True, False], [True, False]))\n",
"# [ True False]\n",
"print(np.logical_and(x > 1, x < 4))\n",
"# [False False True True False]\n",
"\n",
"【例】逐元素计算x1 OR x2的真值。\n",
"\n",
"\n",
"print(np.logical_or(True, False))\n",
"# True\n",
"print(np.logical_or([True, False], [False, False]))\n",
"# [ True False]\n",
"print(np.logical_or(x < 1, x > 3))\n",
"# [ True False False False True]\n",
"\n",
"【例】计算x1 XOR x2的真值按元素计算。\n",
"\n",
"print(np.logical_xor(True, False))\n",
"# True\n",
"print(np.logical_xor([True, True, False, False], [True, False, True, False]))\n",
"# [False True True False]\n",
"print(np.logical_xor(x < 1, x > 3))\n",
"# [ True False False False True]\n",
"print(np.logical_xor(0, np.eye(2)))\n",
"# [[ True False]\n",
"# [False True]]\n",
"```\n",
"\n",
"\n",
"## 对照\n",
"\n",
"- `numpy.greater(x1, x2, *args, **kwargs)` Return the truth value of (x1 > x2) element-wise.\n",
"- `numpy.greater_equal(x1, x2, *args, **kwargs)` Return the truth value of (x1 >= x2) element-wise.\n",
"- `numpy.equal(x1, x2, *args, **kwargs)` Return (x1 == x2) element-wise.\n",
"- `numpy.not_equal(x1, x2, *args, **kwargs)` Return (x1 != x2) element-wise.\n",
"- `numpy.less(x1, x2, *args, **kwargs)` Return the truth value of (x1 < x2) element-wise.\n",
"- `numpy.less_equal(x1, x2, *args, **kwargs)` Return the truth value of (x1 =< x2) element-wise.\n",
"\n",
"\n",
"\n",
"【例】numpy对以上对照函数进行了运算符的重载。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"\n",
"y = x > 2\n",
"print(y)\n",
"print(np.greater(x, 2))\n",
"# [False False True True True True True True]\n",
"\n",
"y = x >= 2\n",
"print(y)\n",
"print(np.greater_equal(x, 2))\n",
"# [False True True True True True True True]\n",
"\n",
"y = x == 2\n",
"print(y)\n",
"print(np.equal(x, 2))\n",
"# [False True False False False False False False]\n",
"\n",
"y = x != 2\n",
"print(y)\n",
"print(np.not_equal(x, 2))\n",
"# [ True False True True True True True True]\n",
"\n",
"y = x < 2\n",
"print(y)\n",
"print(np.less(x, 2))\n",
"# [ True False False False False False False False]\n",
"\n",
"y = x <= 2\n",
"print(y)\n",
"print(np.less_equal(x, 2))\n",
"# [ True True False False False False False False]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x > 20\n",
"print(y)\n",
"print(np.greater(x, 20))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"\n",
"y = x >= 20\n",
"print(y)\n",
"print(np.greater_equal(x, 20))\n",
"# [[False False False False False]\n",
"# [False False False False True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"\n",
"y = x == 20\n",
"print(y)\n",
"print(np.equal(x, 20))\n",
"# [[False False False False False]\n",
"# [False False False False True]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]]\n",
"\n",
"y = x != 20\n",
"print(y)\n",
"print(np.not_equal(x, 20))\n",
"# [[ True True True True True]\n",
"# [ True True True True False]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"\n",
"\n",
"y = x < 20\n",
"print(y)\n",
"print(np.less(x, 20))\n",
"# [[ True True True True True]\n",
"# [ True True True True False]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]]\n",
"\n",
"y = x <= 20\n",
"print(y)\n",
"print(np.less_equal(x, 20))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(20200611)\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.random.randint(10, 40, [5, 5])\n",
"print(y)\n",
"# [[32 28 31 33 37]\n",
"# [23 37 37 30 29]\n",
"# [32 24 10 33 15]\n",
"# [27 17 10 36 16]\n",
"# [25 32 23 39 34]]\n",
"\n",
"z = x > y\n",
"print(z)\n",
"print(np.greater(x, y))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False True False True]\n",
"# [False True True False True]\n",
"# [ True False True False True]]\n",
"\n",
"z = x >= y\n",
"print(z)\n",
"print(np.greater_equal(x, y))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False True False True]\n",
"# [False True True False True]\n",
"# [ True True True False True]]\n",
"\n",
"z = x == y\n",
"print(z)\n",
"print(np.equal(x, y))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False True False False False]]\n",
"\n",
"z = x != y\n",
"print(z)\n",
"print(np.not_equal(x, y))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True False True True True]]\n",
"\n",
"z = x < y\n",
"print(z)\n",
"print(np.less(x, y))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True False True False]\n",
"# [ True False False True False]\n",
"# [False False False True False]]\n",
"\n",
"z = x <= y\n",
"print(z)\n",
"print(np.less_equal(x, y))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True False True False]\n",
"# [ True False False True False]\n",
"# [False True False True False]]\n",
"```\n",
"\n",
"【例】注意 numpy 的广播规则。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"np.random.seed(20200611)\n",
"y = np.random.randint(10, 50, 5)\n",
"\n",
"print(y)\n",
"# [32 37 30 24 10]\n",
"\n",
"z = x > y\n",
"print(z)\n",
"print(np.greater(x, y))\n",
"# [[False False False False True]\n",
"# [False False False False True]\n",
"# [False False False False True]\n",
"# [False False False True True]\n",
"# [False False True True True]]\n",
"\n",
"z = x >= y\n",
"print(z)\n",
"print(np.greater_equal(x, y))\n",
"# [[False False False False True]\n",
"# [False False False False True]\n",
"# [False False False True True]\n",
"# [False False False True True]\n",
"# [False False True True True]]\n",
"\n",
"z = x == y\n",
"print(z)\n",
"print(np.equal(x, y))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False False True False]\n",
"# [False False False False False]\n",
"# [False False False False False]]\n",
"\n",
"z = x != y\n",
"print(z)\n",
"print(np.not_equal(x, y))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True False True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"\n",
"z = x < y\n",
"print(z)\n",
"print(np.less(x, y))\n",
"# [[ True True True True False]\n",
"# [ True True True True False]\n",
"# [ True True True False False]\n",
"# [ True True True False False]\n",
"# [ True True False False False]]\n",
"\n",
"z = x <= y\n",
"print(z)\n",
"print(np.less_equal(x, y))\n",
"# [[ True True True True False]\n",
"# [ True True True True False]\n",
"# [ True True True True False]\n",
"# [ True True True False False]\n",
"# [ True True False False False]]\n",
"```\n",
"\n",
"\n",
"- `numpy.isclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False)` Returns a boolean array where two arrays are element-wise equal within a tolerance.\n",
"- `numpy.allclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False)` Returns True if two arrays are element-wise equal within a tolerance. \n",
"\n",
"`numpy.allclose()` 等价于 `numpy.all(isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan))`。\n",
"\n",
"The tolerance values are positive, typically very small numbers. The relative difference (`rtol * abs(b)`) and the absolute difference `atol` are added together to compare against the absolute difference between `a` and `b`.\n",
"\n",
"判断是否为True的计算依据\n",
"\n",
"```python\n",
"np.absolute(a - b) <= (atol + rtol * absolute(b))\n",
"\n",
"- atolfloat绝对公差。\n",
"- rtolfloat相对公差。\n",
"```\n",
"\n",
"NaNs are treated as equal if they are in the same place and if `equal_nan=True`. Infs are treated as equal if they are in the same place and of the same sign in both arrays.\n",
"\n",
"【例】比较两个数组是否可以认为相等。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.isclose([1e10, 1e-7], [1.00001e10, 1e-8])\n",
"print(x) # [ True False]\n",
"\n",
"x = np.allclose([1e10, 1e-7], [1.00001e10, 1e-8])\n",
"print(x) # False\n",
"\n",
"x = np.isclose([1e10, 1e-8], [1.00001e10, 1e-9])\n",
"print(x) # [ True True]\n",
"\n",
"x = np.allclose([1e10, 1e-8], [1.00001e10, 1e-9])\n",
"print(x) # True\n",
"\n",
"x = np.isclose([1e10, 1e-8], [1.0001e10, 1e-9])\n",
"print(x) # [False True]\n",
"\n",
"x = np.allclose([1e10, 1e-8], [1.0001e10, 1e-9])\n",
"print(x) # False\n",
"\n",
"x = np.isclose([1.0, np.nan], [1.0, np.nan])\n",
"print(x) # [ True False]\n",
"\n",
"x = np.allclose([1.0, np.nan], [1.0, np.nan])\n",
"print(x) # False\n",
"\n",
"x = np.isclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)\n",
"print(x) # [ True True]\n",
"\n",
"x = np.allclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)\n",
"print(x) # True\n",
"```\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,851 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 向量化和广播\n",
"\n",
"向量化和广播这两个概念是 numpy 内部实现的基础。有了向量化编写代码时无需使用显式循环。这些循环实际上不能省略只不过是在内部实现被代码中的其他结构代替。向量化的应用使得代码更简洁可读性更强也可以说使用了向量化方法的代码看上去更“Pythonic”。\n",
"\n",
"广播Broadcasting机制描述了 numpy 如何在算术运算期间处理具有不同形状的数组,让较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。并不是所有的维度都要彼此兼容才符合广播机制的要求,但它们必须满足一定的条件。\n",
"\n",
"若两个数组的各维度兼容,也就是两个数组的每一维等长,或其中一个数组为 一维那么广播机制就适用。如果这两个条件不满足numpy就会抛出异常说两个数组不兼容。\n",
"\n",
"总结来说,广播的规则有三个:\n",
"- 如果两个数组的维度数dim不相同那么小维度数组的形状将会在左边补1。\n",
"- 如果shape维度不匹配但是有维度是1那么可以扩展维度是1的维度匹配另一个数组\n",
"- 如果shape维度不匹配但是没有任何一个维度是1则匹配引发错误\n",
"\n",
"【例】二维数组加一维数组\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(4)\n",
"y = np.ones((3, 4))\n",
"print(x.shape) # (4,)\n",
"print(y.shape) # (3, 4)\n",
"\n",
"print((x + y).shape) # (3, 4)\n",
"print(x + y)\n",
"# [[1. 2. 3. 4.]\n",
"# [1. 2. 3. 4.]\n",
"# [1. 2. 3. 4.]]\n",
"```\n",
"\n",
"\n",
"【例】两个数组均需要广播\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(4).reshape(4, 1)\n",
"y = np.ones(5)\n",
"\n",
"print(x.shape) # (4, 1)\n",
"print(y.shape) # (5,)\n",
"\n",
"print((x + y).shape) # (4, 5)\n",
"print(x + y)\n",
"# [[1. 1. 1. 1. 1.]\n",
"# [2. 2. 2. 2. 2.]\n",
"# [3. 3. 3. 3. 3.]\n",
"# [4. 4. 4. 4. 4.]]\n",
"\n",
"x = np.array([0.0, 10.0, 20.0, 30.0])\n",
"y = np.array([1.0, 2.0, 3.0])\n",
"z = x[:, np.newaxis] + y\n",
"print(z)\n",
"# [[ 1. 2. 3.]\n",
"# [11. 12. 13.]\n",
"# [21. 22. 23.]\n",
"# [31. 32. 33.]]\n",
"```\n",
"\n",
"【例】不匹配报错的例子\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(4)\n",
"y = np.ones(5)\n",
"\n",
"print(x.shape) # (4,)\n",
"print(y.shape) # (5,)\n",
"\n",
"print(x + y)\n",
"# ValueError: operands could not be broadcast together with shapes (4,) (5,) \n",
"```\n",
"\n",
"\n",
"---\n",
"# 数学函数\n",
"\n",
"\n",
"## 算数运算\n",
"### numpy.add\n",
"### numpy.subtract\n",
"### numpy.multiply\n",
"### numpy.divide\n",
"### numpy.floor_divide\n",
"### numpy.power\n",
"- `numpy.add(x1, x2, *args, **kwargs)` Add arguments element-wise.\n",
"- `numpy.subtract(x1, x2, *args, **kwargs)` Subtract arguments element-wise.\n",
"- `numpy.multiply(x1, x2, *args, **kwargs)` Multiply arguments element-wise.\n",
"- `numpy.divide(x1, x2, *args, **kwargs)` Returns a true division of the inputs, element-wise.\n",
"- `numpy.floor_divide(x1, x2, *args, **kwargs)` Return the largest integer smaller or equal to the division of the inputs.\n",
"- `numpy.power(x1, x2, *args, **kwargs)` First array elements raised to powers from second array, element-wise.\n",
"\n",
"在 numpy 中对以上函数进行了运算符的重载,且运算符为 **元素级**。也就是说,它们只用于位置相同的元素之间,所得到的运算结果组成一个新的数组。\n",
"\n",
"【例】注意 numpy 的广播规则。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"y = x + 1\n",
"print(y)\n",
"print(np.add(x, 1))\n",
"# [2 3 4 5 6 7 8 9]\n",
"\n",
"y = x - 1\n",
"print(y)\n",
"print(np.subtract(x, 1))\n",
"# [0 1 2 3 4 5 6 7]\n",
"\n",
"y = x * 2\n",
"print(y)\n",
"print(np.multiply(x, 2))\n",
"# [ 2 4 6 8 10 12 14 16]\n",
"\n",
"y = x / 2\n",
"print(y)\n",
"print(np.divide(x, 2))\n",
"# [0.5 1. 1.5 2. 2.5 3. 3.5 4. ]\n",
"\n",
"y = x // 2\n",
"print(y)\n",
"print(np.floor_divide(x, 2))\n",
"# [0 1 1 2 2 3 3 4]\n",
"\n",
"y = x ** 2\n",
"print(y)\n",
"print(np.power(x, 2))\n",
"# [ 1 4 9 16 25 36 49 64]\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"【例】注意 numpy 的广播规则。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x + 1\n",
"print(y)\n",
"print(np.add(x, 1))\n",
"# [[12 13 14 15 16]\n",
"# [17 18 19 20 21]\n",
"# [22 23 24 25 26]\n",
"# [27 28 29 30 31]\n",
"# [32 33 34 35 36]]\n",
"\n",
"y = x - 1\n",
"print(y)\n",
"print(np.subtract(x, 1))\n",
"# [[10 11 12 13 14]\n",
"# [15 16 17 18 19]\n",
"# [20 21 22 23 24]\n",
"# [25 26 27 28 29]\n",
"# [30 31 32 33 34]]\n",
"\n",
"y = x * 2\n",
"print(y)\n",
"print(np.multiply(x, 2))\n",
"# [[22 24 26 28 30]\n",
"# [32 34 36 38 40]\n",
"# [42 44 46 48 50]\n",
"# [52 54 56 58 60]\n",
"# [62 64 66 68 70]]\n",
"\n",
"y = x / 2\n",
"print(y)\n",
"print(np.divide(x, 2))\n",
"# [[ 5.5 6. 6.5 7. 7.5]\n",
"# [ 8. 8.5 9. 9.5 10. ]\n",
"# [10.5 11. 11.5 12. 12.5]\n",
"# [13. 13.5 14. 14.5 15. ]\n",
"# [15.5 16. 16.5 17. 17.5]]\n",
"\n",
"y = x // 2\n",
"print(y)\n",
"print(np.floor_divide(x, 2))\n",
"# [[ 5 6 6 7 7]\n",
"# [ 8 8 9 9 10]\n",
"# [10 11 11 12 12]\n",
"# [13 13 14 14 15]\n",
"# [15 16 16 17 17]]\n",
"\n",
"y = x ** 2\n",
"print(y)\n",
"print(np.power(x, 2))\n",
"# [[ 121 144 169 196 225]\n",
"# [ 256 289 324 361 400]\n",
"# [ 441 484 529 576 625]\n",
"# [ 676 729 784 841 900]\n",
"# [ 961 1024 1089 1156 1225]]\n",
"```\n",
"\n",
"【例】注意 numpy 的广播规则。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.arange(1, 6)\n",
"print(y)\n",
"# [1 2 3 4 5]\n",
"\n",
"z = x + y\n",
"print(z)\n",
"print(np.add(x, y))\n",
"# [[12 14 16 18 20]\n",
"# [17 19 21 23 25]\n",
"# [22 24 26 28 30]\n",
"# [27 29 31 33 35]\n",
"# [32 34 36 38 40]]\n",
"\n",
"z = x - y\n",
"print(z)\n",
"print(np.subtract(x, y))\n",
"# [[10 10 10 10 10]\n",
"# [15 15 15 15 15]\n",
"# [20 20 20 20 20]\n",
"# [25 25 25 25 25]\n",
"# [30 30 30 30 30]]\n",
"\n",
"z = x * y\n",
"print(z)\n",
"print(np.multiply(x, y))\n",
"# [[ 11 24 39 56 75]\n",
"# [ 16 34 54 76 100]\n",
"# [ 21 44 69 96 125]\n",
"# [ 26 54 84 116 150]\n",
"# [ 31 64 99 136 175]]\n",
"\n",
"z = x / y\n",
"print(z)\n",
"print(np.divide(x, y))\n",
"# [[11. 6. 4.33333333 3.5 3. ]\n",
"# [16. 8.5 6. 4.75 4. ]\n",
"# [21. 11. 7.66666667 6. 5. ]\n",
"# [26. 13.5 9.33333333 7.25 6. ]\n",
"# [31. 16. 11. 8.5 7. ]]\n",
"\n",
"z = x // y\n",
"print(z)\n",
"print(np.floor_divide(x, y))\n",
"# [[11 6 4 3 3]\n",
"# [16 8 6 4 4]\n",
"# [21 11 7 6 5]\n",
"# [26 13 9 7 6]\n",
"# [31 16 11 8 7]]\n",
"\n",
"z = x ** np.full([1, 5], 2)\n",
"print(z)\n",
"print(np.power(x, np.full([5, 5], 2)))\n",
"# [[ 121 144 169 196 225]\n",
"# [ 256 289 324 361 400]\n",
"# [ 441 484 529 576 625]\n",
"# [ 676 729 784 841 900]\n",
"# [ 961 1024 1089 1156 1225]]\n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.arange(1, 26).reshape([5, 5])\n",
"print(y)\n",
"# [[ 1 2 3 4 5]\n",
"# [ 6 7 8 9 10]\n",
"# [11 12 13 14 15]\n",
"# [16 17 18 19 20]\n",
"# [21 22 23 24 25]]\n",
"\n",
"z = x + y\n",
"print(z)\n",
"print(np.add(x, y))\n",
"# [[12 14 16 18 20]\n",
"# [22 24 26 28 30]\n",
"# [32 34 36 38 40]\n",
"# [42 44 46 48 50]\n",
"# [52 54 56 58 60]]\n",
"\n",
"z = x - y\n",
"print(z)\n",
"print(np.subtract(x, y))\n",
"# [[10 10 10 10 10]\n",
"# [10 10 10 10 10]\n",
"# [10 10 10 10 10]\n",
"# [10 10 10 10 10]\n",
"# [10 10 10 10 10]]\n",
"\n",
"z = x * y\n",
"print(z)\n",
"print(np.multiply(x, y))\n",
"# [[ 11 24 39 56 75]\n",
"# [ 96 119 144 171 200]\n",
"# [231 264 299 336 375]\n",
"# [416 459 504 551 600]\n",
"# [651 704 759 816 875]]\n",
"\n",
"z = x / y\n",
"print(z)\n",
"print(np.divide(x, y))\n",
"# [[11. 6. 4.33333333 3.5 3. ]\n",
"# [ 2.66666667 2.42857143 2.25 2.11111111 2. ]\n",
"# [ 1.90909091 1.83333333 1.76923077 1.71428571 1.66666667]\n",
"# [ 1.625 1.58823529 1.55555556 1.52631579 1.5 ]\n",
"# [ 1.47619048 1.45454545 1.43478261 1.41666667 1.4 ]]\n",
"\n",
"z = x // y\n",
"print(z)\n",
"print(np.floor_divide(x, y))\n",
"# [[11 6 4 3 3]\n",
"# [ 2 2 2 2 2]\n",
"# [ 1 1 1 1 1]\n",
"# [ 1 1 1 1 1]\n",
"# [ 1 1 1 1 1]]\n",
"\n",
"z = x ** np.full([5, 5], 2)\n",
"print(z)\n",
"print(np.power(x, np.full([5, 5], 2)))\n",
"# [[ 121 144 169 196 225]\n",
"# [ 256 289 324 361 400]\n",
"# [ 441 484 529 576 625]\n",
"# [ 676 729 784 841 900]\n",
"# [ 961 1024 1089 1156 1225]]\n",
"```\n",
"\n",
"### numpy.sqrt\n",
"### numpy.square\n",
"- `numpy.sqrt(x, *args, **kwargs)` Return the non-negative square-root of an array, element-wise.\n",
"- `numpy.square(x, *args, **kwargs)` Return the element-wise square of the input.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(1, 5)\n",
"print(x) # [1 2 3 4]\n",
"\n",
"y = np.sqrt(x)\n",
"print(y)\n",
"# [1. 1.41421356 1.73205081 2. ]\n",
"print(np.power(x, 0.5))\n",
"# [1. 1.41421356 1.73205081 2. ]\n",
"\n",
"y = np.square(x)\n",
"print(y)\n",
"# [ 1 4 9 16]\n",
"print(np.power(x, 2))\n",
"# [ 1 4 9 16]\n",
"```\n",
"\n",
"\n",
"---\n",
"## 三角函数\n",
"\n",
"### numpy.sin\n",
"### numpy.cos\n",
"### numpy.tan\n",
"### numpy.arcsin\n",
"### numpy.arccos\n",
"### numpy.arctan\n",
"\n",
"- `numpy.sin(x, *args, **kwargs)` Trigonometric sine, element-wise.\n",
"- `numpy.cos(x, *args, **kwargs)` Cosine element-wise.\n",
"- `numpy.tan(x, *args, **kwargs)` Compute tangent element-wise.\n",
"- `numpy.arcsin(x, *args, **kwargs)` Inverse sine, element-wise.\n",
"- `numpy.arccos(x, *args, **kwargs)` Trigonometric inverse cosine, element-wise.\n",
"- `numpy.arctan(x, *args, **kwargs)` Trigonometric inverse tangent, element-wise.\n",
"\n",
"\n",
"**通用函数**universal function通常叫作ufunc它对数组中的各个元素逐一进行操作。这表明通用函数分别处理输入数组的每个元素生成的结果组成一个新的输出数组。输出数组的大小跟输入数组相同。\n",
"\n",
"三角函数等很多数学运算符合通用函数的定义,例如,计算平方根的`sqrt()`函数、用来取对数的`log()`函数和求正弦值的`sin()`函数。\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.linspace(start=0, stop=np.pi / 2, num=10)\n",
"print(x)\n",
"# [0. 0.17453293 0.34906585 0.52359878 0.6981317 0.87266463\n",
"# 1.04719755 1.22173048 1.3962634 1.57079633]\n",
"\n",
"y = np.sin(x)\n",
"print(y)\n",
"# [0. 0.17364818 0.34202014 0.5 0.64278761 0.76604444\n",
"# 0.8660254 0.93969262 0.98480775 1. ]\n",
"\n",
"z = np.arcsin(y)\n",
"print(z)\n",
"# [0. 0.17453293 0.34906585 0.52359878 0.6981317 0.87266463\n",
"# 1.04719755 1.22173048 1.3962634 1.57079633]\n",
"\n",
"y = np.cos(x)\n",
"print(y)\n",
"# [1.00000000e+00 9.84807753e-01 9.39692621e-01 8.66025404e-01\n",
"# 7.66044443e-01 6.42787610e-01 5.00000000e-01 3.42020143e-01\n",
"# 1.73648178e-01 6.12323400e-17]\n",
"\n",
"z = np.arccos(y)\n",
"print(z)\n",
"# [0. 0.17453293 0.34906585 0.52359878 0.6981317 0.87266463\n",
"# 1.04719755 1.22173048 1.3962634 1.57079633]\n",
"\n",
"y = np.tan(x)\n",
"print(y)\n",
"# [0.00000000e+00 1.76326981e-01 3.63970234e-01 5.77350269e-01\n",
"# 8.39099631e-01 1.19175359e+00 1.73205081e+00 2.74747742e+00\n",
"# 5.67128182e+00 1.63312394e+16]\n",
"\n",
"z = np.arctan(y)\n",
"print(z)\n",
"# [0. 0.17453293 0.34906585 0.52359878 0.6981317 0.87266463\n",
"# 1.04719755 1.22173048 1.3962634 1.57079633]\n",
"```\n",
"\n",
"---\n",
"## 指数和对数\n",
"### numpy.exp\n",
"### numpy.log\n",
"### numpy.exp2\n",
"### numpy.log2\n",
"### numpy.log10\n",
"\n",
"- `numpy.exp(x, *args, **kwargs)` Calculate the exponential of all elements in the input array.\n",
"- `numpy.log(x, *args, **kwargs)` Natural logarithm, element-wise.\n",
"- `numpy.exp2(x, *args, **kwargs)` Calculate `2**p` for all `p` in the input array.\n",
"- `numpy.log2(x, *args, **kwargs)` Base-2 logarithm of `x`.\n",
"- `numpy.log10(x, *args, **kwargs)` Return the base 10 logarithm of the input array, element-wise.\n",
"\n",
"\n",
"\n",
"\n",
"【例】The natural logarithm `log` is the inverse of the exponential function, so that `log(exp(x)) = x`. The natural logarithm is logarithm in base `e`.\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(1, 5)\n",
"print(x)\n",
"# [1 2 3 4]\n",
"y = np.exp(x)\n",
"print(y)\n",
"# [ 2.71828183 7.3890561 20.08553692 54.59815003]\n",
"z = np.log(y)\n",
"print(z)\n",
"# [1. 2. 3. 4.]\n",
"```\n",
"\n",
"\n",
"\n",
"---\n",
"## 加法函数、乘法函数\n",
"### numpy.sum\n",
"\n",
"- `numpy.sum(a[, axis=None, dtype=None, out=None, …])` Sum of array elements over a given axis.\n",
"\n",
"通过不同的 `axis`numpy 会沿着不同的方向进行操作:如果不设置,那么对所有的元素操作;如果`axis=0`,则沿着纵轴进行操作;`axis=1`,则沿着横轴进行操作。但这只是简单的二位数组,如果是多维的呢?可以总结为一句话:设`axis=i`,则 numpy 沿着第`i`个下标变化的方向进行操作。\n",
"\n",
"### numpy.cumsum\n",
"\n",
"- `numpy.cumsum(a, axis=None, dtype=None, out=None)` Return the cumulative sum of the elements along a given axis.\n",
"\n",
"**聚合函数** 是指对一组值(比如一个数组)进行操作,返回一个单一值作为结果的函数。因而,求数组所有元素之和的函数就是聚合函数。`ndarray`类实现了多个这样的函数。\n",
"\n",
"【例】返回给定轴上的数组元素的总和。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.sum(x)\n",
"print(y) # 575\n",
"\n",
"y = np.sum(x, axis=0)\n",
"print(y) # [105 110 115 120 125]\n",
"\n",
"y = np.sum(x, axis=1)\n",
"print(y) # [ 65 90 115 140 165]\n",
"```\n",
"\n",
"\n",
"【例】返回给定轴上的数组元素的累加和。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.cumsum(x)\n",
"print(y)\n",
"# [ 11 23 36 50 65 81 98 116 135 155 176 198 221 245 270 296 323 351\n",
"# 380 410 441 473 506 540 575]\n",
"\n",
"y = np.cumsum(x, axis=0)\n",
"print(y)\n",
"# [[ 11 12 13 14 15]\n",
"# [ 27 29 31 33 35]\n",
"# [ 48 51 54 57 60]\n",
"# [ 74 78 82 86 90]\n",
"# [105 110 115 120 125]]\n",
"\n",
"y = np.cumsum(x, axis=1)\n",
"print(y)\n",
"# [[ 11 23 36 50 65]\n",
"# [ 16 33 51 70 90]\n",
"# [ 21 43 66 90 115]\n",
"# [ 26 53 81 110 140]\n",
"# [ 31 63 96 130 165]]\n",
"```\n",
"### numpy.prod 乘积\n",
"- `numpy.prod(a[, axis=None, dtype=None, out=None, …])` Return the product of array elements over a given axis.\n",
"\n",
"### numpy.cumprod 累乘\n",
"- `numpy.cumprod(a, axis=None, dtype=None, out=None)` Return the cumulative product of elements along a given axis.\n",
"\n",
"【例】返回给定轴上数组元素的乘积。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.prod(x)\n",
"print(y) # 788529152\n",
"\n",
"y = np.prod(x, axis=0)\n",
"print(y)\n",
"# [2978976 3877632 4972968 6294624 7875000]\n",
"\n",
"y = np.prod(x, axis=1)\n",
"print(y)\n",
"# [ 360360 1860480 6375600 17100720 38955840]\n",
"```\n",
"\n",
"\n",
"【例】返回给定轴上数组元素的累乘。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.cumprod(x)\n",
"print(y)\n",
"# [ 11 132 1716 24024 360360 5765760\n",
"# 98017920 1764322560 -837609728 427674624 391232512 17180672\n",
"# 395155456 893796352 870072320 1147043840 905412608 -418250752\n",
"# 755630080 1194065920 -1638662144 -897581056 444596224 -2063597568\n",
"# 788529152]\n",
"\n",
"y = np.cumprod(x, axis=0)\n",
"print(y)\n",
"# [[ 11 12 13 14 15]\n",
"# [ 176 204 234 266 300]\n",
"# [ 3696 4488 5382 6384 7500]\n",
"# [ 96096 121176 150696 185136 225000]\n",
"# [2978976 3877632 4972968 6294624 7875000]]\n",
"\n",
"y = np.cumprod(x, axis=1)\n",
"print(y)\n",
"# [[ 11 132 1716 24024 360360]\n",
"# [ 16 272 4896 93024 1860480]\n",
"# [ 21 462 10626 255024 6375600]\n",
"# [ 26 702 19656 570024 17100720]\n",
"# [ 31 992 32736 1113024 38955840]]\n",
"```\n",
"### numpy.diff 差值\n",
"\n",
"- `numpy.diff(a, n=1, axis=-1, prepend=np._NoValue, append=np._NoValue)` Calculate the n-th discrete difference along the given axis.\n",
" - a输入矩阵\n",
" - n可选代表要执行几次差值\n",
" - axis默认是最后一个\n",
"\n",
"\n",
"The first difference is given by `out[i] = a[i+1] - a[i]` along the given axis, higher differences are calculated by using `diff` recursively.\n",
"\n",
"【例】沿着指定轴计算第N维的离散差值。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"A = np.arange(2, 14).reshape((3, 4))\n",
"A[1, 1] = 8\n",
"print(A)\n",
"# [[ 2 3 4 5]\n",
"# [ 6 8 8 9]\n",
"# [10 11 12 13]]\n",
"print(np.diff(A))\n",
"# [[1 1 1]\n",
"# [2 0 1]\n",
"# [1 1 1]]\n",
"print(np.diff(A, axis=0))\n",
"# [[4 5 4 4]\n",
"# [4 3 4 4]]\n",
"```\n",
"\n",
"\n",
"\n",
"---\n",
"## 四舍五入\n",
"### numpy.around 舍入\n",
"\n",
"- `numpy.around(a, decimals=0, out=None)` Evenly round to the given number of decimals.\n",
"\n",
"\n",
"【例】将数组舍入到给定的小数位数。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.rand(3, 3) * 10\n",
"print(x)\n",
"# [[6.59144457 3.78566113 8.15321227]\n",
"# [1.68241475 3.78753332 7.68886328]\n",
"# [2.84255822 9.58106727 7.86678037]]\n",
"\n",
"y = np.around(x)\n",
"print(y)\n",
"# [[ 7. 4. 8.]\n",
"# [ 2. 4. 8.]\n",
"# [ 3. 10. 8.]]\n",
"\n",
"y = np.around(x, decimals=2)\n",
"print(y)\n",
"# [[6.59 3.79 8.15]\n",
"# [1.68 3.79 7.69]\n",
"# [2.84 9.58 7.87]]\n",
"```\n",
"### numpy.ceil 上限\n",
"### numpy.floor 下限\n",
"\n",
"- `numpy.ceil(x, *args, **kwargs)` Return the ceiling of the input, element-wise.\n",
"- `numpy.floor(x, *args, **kwargs)` Return the floor of the input, element-wise.\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.random.rand(3, 3) * 10\n",
"print(x)\n",
"# [[0.67847795 1.33073923 4.53920122]\n",
"# [7.55724676 5.88854047 2.65502046]\n",
"# [8.67640444 8.80110812 5.97528726]]\n",
"\n",
"y = np.ceil(x)\n",
"print(y)\n",
"# [[1. 2. 5.]\n",
"# [8. 6. 3.]\n",
"# [9. 9. 6.]]\n",
"\n",
"y = np.floor(x)\n",
"print(y)\n",
"# [[0. 1. 4.]\n",
"# [7. 5. 2.]\n",
"# [8. 8. 5.]]\n",
"```\n",
"\n",
"---\n",
"## 杂项\n",
"\n",
"### numpy.clip 裁剪\n",
"\n",
"- `numpy.clip(a, a_min, a_max, out=None, **kwargs):` Clip (limit) the values in an array.\n",
"\n",
"Given an interval, values outside the interval are clipped to the interval edges. For example, if an interval of `[0, 1]` is specified, values smaller than 0 become 0, and values larger than 1 become 1.\n",
"\n",
"\n",
"【例】裁剪(限制)数组中的值。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.clip(x, a_min=20, a_max=30)\n",
"print(y)\n",
"# [[20 20 20 20 20]\n",
"# [20 20 20 20 20]\n",
"# [21 22 23 24 25]\n",
"# [26 27 28 29 30]\n",
"# [30 30 30 30 30]]\n",
"```\n",
"### numpy.absolute 绝对值\n",
"### numpy.abs\n",
"\n",
"- `numpy.absolute(x, *args, **kwargs)` Calculate the absolute value element-wise. \n",
"- `numpy.abs(x, *args, **kwargs)` is a shorthand for this function.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(-5, 5)\n",
"print(x)\n",
"# [-5 -4 -3 -2 -1 0 1 2 3 4]\n",
"\n",
"y = np.abs(x)\n",
"print(y)\n",
"# [5 4 3 2 1 0 1 2 3 4]\n",
"\n",
"y = np.absolute(x)\n",
"print(y)\n",
"# [5 4 3 2 1 0 1 2 3 4]\n",
"```\n",
"### numpy.sign 返回数字符号的逐元素指示\n",
"- `numpy.sign(x, *args, **kwargs)` Returns an element-wise indication of the sign of a number.\n",
"\n",
"【例】\n",
"\n",
"```python\n",
"x = np.arange(-5, 5)\n",
"print(x)\n",
"#[-5 -4 -3 -2 -1 0 1 2 3 4]\n",
"print(np.sign(x))\n",
"#[-1 -1 -1 -1 -1 0 1 1 1 1]\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"---\n",
"**参考文献**\n",
"- https://mp.weixin.qq.com/s/RWsGvvmw4ptf7d8zPIDEJw\n",
"- https://blog.csdn.net/hanshuobest/article/details/78558826?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-08-30T17:00:33.199734Z",
"start_time": "2020-08-30T17:00:33.194782Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-5 -4 -3 -2 -1 0 1 2 3 4]\n",
"[-1 -1 -1 -1 -1 0 1 1 1 1]\n"
]
}
],
"source": [
"x = np.arange(-5, 5)\n",
"print(x)\n",
"print(np.sign(x))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.2px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,516 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 逻辑函数\n",
"\n",
"## 真值测试\n",
"### numpy.all\n",
"### numpy.any\n",
"\n",
"- `numpy.all(a, axis=None, out=None, keepdims=np._NoValue)` Test whether all array elements along a given axis evaluate to True.\n",
"- `numpy.any(a, axis=None, out=None, keepdims=np._NoValue)` Test whether any array element along a given axis evaluates to True.\n",
"\n",
"\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array([0, 4, 5])\n",
"b = np.copy(a)\n",
"print(np.all(a == b)) # True\n",
"print(np.any(a == b)) # True\n",
"\n",
"b[0] = 1\n",
"print(np.all(a == b)) # False\n",
"print(np.any(a == b)) # True\n",
"\n",
"print(np.all([1.0, np.nan])) # True\n",
"print(np.any([1.0, np.nan])) # True\n",
"\n",
"a = np.eye(3)\n",
"print(np.all(a, axis=0)) # [False False False]\n",
"print(np.any(a, axis=0)) # [ True True True]\n",
"```\n",
"\n",
"\n",
"---\n",
"## 数组内容\n",
"### numpy.isnan\n",
"\n",
"- `numpy.isnan(x, *args, **kwargs)` Test element-wise for NaN and return result as a boolean array.\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"a=np.array([1,2,np.nan])\n",
"print(np.isnan(a))\n",
"#[False False True]\n",
"\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"---\n",
"## 逻辑运算\n",
"### numpy.logical_not\n",
"### numpy.logical_and\n",
"### numpy.logical_or\n",
"### numpy.logical_xor\n",
"\n",
"\n",
"- `numpy.logical_not(x, *args, **kwargs)`Compute the truth value of NOT x element-wise.\n",
"- `numpy.logical_and(x1, x2, *args, **kwargs)` Compute the truth value of x1 AND x2 element-wise.\n",
"- `numpy.logical_or(x1, x2, *args, **kwargs)`Compute the truth value of x1 OR x2 element-wise.\n",
"- `numpy.logical_xor(x1, x2, *args, **kwargs)`Compute the truth value of x1 XOR x2, element-wise.\n",
"\n",
"\n",
"\n",
"\n",
"```python\n",
"【例】计算非x元素的真值。\n",
"\n",
"import numpy as np\n",
"\n",
"print(np.logical_not(3)) \n",
"# False\n",
"print(np.logical_not([True, False, 0, 1]))\n",
"# [False True True False]\n",
"\n",
"x = np.arange(5)\n",
"print(np.logical_not(x < 3))\n",
"# [False False False True True]\n",
"\n",
"【例】计算x1 AND x2元素的真值。\n",
"\n",
"print(np.logical_and(True, False)) \n",
"# False\n",
"print(np.logical_and([True, False], [True, False]))\n",
"# [ True False]\n",
"print(np.logical_and(x > 1, x < 4))\n",
"# [False False True True False]\n",
"\n",
"【例】逐元素计算x1 OR x2的真值。\n",
"\n",
"\n",
"print(np.logical_or(True, False))\n",
"# True\n",
"print(np.logical_or([True, False], [False, False]))\n",
"# [ True False]\n",
"print(np.logical_or(x < 1, x > 3))\n",
"# [ True False False False True]\n",
"\n",
"【例】计算x1 XOR x2的真值按元素计算。\n",
"\n",
"print(np.logical_xor(True, False))\n",
"# True\n",
"print(np.logical_xor([True, True, False, False], [True, False, True, False]))\n",
"# [False True True False]\n",
"print(np.logical_xor(x < 1, x > 3))\n",
"# [ True False False False True]\n",
"print(np.logical_xor(0, np.eye(2)))\n",
"# [[ True False]\n",
"# [False True]]\n",
"```\n",
"\n",
"\n",
"## 对照\n",
"### numpy.greater\n",
"### numpy.greater_equal\n",
"### numpy.equal\n",
"### numpy.not_equal\n",
"### numpy.less\n",
"### numpy.less_equal\n",
"\n",
"\n",
"- `numpy.greater(x1, x2, *args, **kwargs)` Return the truth value of (x1 > x2) element-wise.\n",
"- `numpy.greater_equal(x1, x2, *args, **kwargs)` Return the truth value of (x1 >= x2) element-wise.\n",
"- `numpy.equal(x1, x2, *args, **kwargs)` Return (x1 == x2) element-wise.\n",
"- `numpy.not_equal(x1, x2, *args, **kwargs)` Return (x1 != x2) element-wise.\n",
"- `numpy.less(x1, x2, *args, **kwargs)` Return the truth value of (x1 < x2) element-wise.\n",
"- `numpy.less_equal(x1, x2, *args, **kwargs)` Return the truth value of (x1 =< x2) element-wise.\n",
"\n",
"\n",
"\n",
"【例】numpy对以上对照函数进行了运算符的重载。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"\n",
"y = x > 2\n",
"print(y)\n",
"print(np.greater(x, 2))\n",
"# [False False True True True True True True]\n",
"\n",
"y = x >= 2\n",
"print(y)\n",
"print(np.greater_equal(x, 2))\n",
"# [False True True True True True True True]\n",
"\n",
"y = x == 2\n",
"print(y)\n",
"print(np.equal(x, 2))\n",
"# [False True False False False False False False]\n",
"\n",
"y = x != 2\n",
"print(y)\n",
"print(np.not_equal(x, 2))\n",
"# [ True False True True True True True True]\n",
"\n",
"y = x < 2\n",
"print(y)\n",
"print(np.less(x, 2))\n",
"# [ True False False False False False False False]\n",
"\n",
"y = x <= 2\n",
"print(y)\n",
"print(np.less_equal(x, 2))\n",
"# [ True True False False False False False False]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = x > 20\n",
"print(y)\n",
"print(np.greater(x, 20))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"\n",
"y = x >= 20\n",
"print(y)\n",
"print(np.greater_equal(x, 20))\n",
"# [[False False False False False]\n",
"# [False False False False True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"\n",
"y = x == 20\n",
"print(y)\n",
"print(np.equal(x, 20))\n",
"# [[False False False False False]\n",
"# [False False False False True]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]]\n",
"\n",
"y = x != 20\n",
"print(y)\n",
"print(np.not_equal(x, 20))\n",
"# [[ True True True True True]\n",
"# [ True True True True False]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"\n",
"\n",
"y = x < 20\n",
"print(y)\n",
"print(np.less(x, 20))\n",
"# [[ True True True True True]\n",
"# [ True True True True False]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]]\n",
"\n",
"y = x <= 20\n",
"print(y)\n",
"print(np.less_equal(x, 20))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(20200611)\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"y = np.random.randint(10, 40, [5, 5])\n",
"print(y)\n",
"# [[32 28 31 33 37]\n",
"# [23 37 37 30 29]\n",
"# [32 24 10 33 15]\n",
"# [27 17 10 36 16]\n",
"# [25 32 23 39 34]]\n",
"\n",
"z = x > y\n",
"print(z)\n",
"print(np.greater(x, y))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False True False True]\n",
"# [False True True False True]\n",
"# [ True False True False True]]\n",
"\n",
"z = x >= y\n",
"print(z)\n",
"print(np.greater_equal(x, y))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False True False True]\n",
"# [False True True False True]\n",
"# [ True True True False True]]\n",
"\n",
"z = x == y\n",
"print(z)\n",
"print(np.equal(x, y))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False False False False False]\n",
"# [False True False False False]]\n",
"\n",
"z = x != y\n",
"print(z)\n",
"print(np.not_equal(x, y))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True False True True True]]\n",
"\n",
"z = x < y\n",
"print(z)\n",
"print(np.less(x, y))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True False True False]\n",
"# [ True False False True False]\n",
"# [False False False True False]]\n",
"\n",
"z = x <= y\n",
"print(z)\n",
"print(np.less_equal(x, y))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True False True False]\n",
"# [ True False False True False]\n",
"# [False True False True False]]\n",
"```\n",
"\n",
"【例】注意 numpy 的广播规则。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"\n",
"np.random.seed(20200611)\n",
"y = np.random.randint(10, 50, 5)\n",
"\n",
"print(y)\n",
"# [32 37 30 24 10]\n",
"\n",
"z = x > y\n",
"print(z)\n",
"print(np.greater(x, y))\n",
"# [[False False False False True]\n",
"# [False False False False True]\n",
"# [False False False False True]\n",
"# [False False False True True]\n",
"# [False False True True True]]\n",
"\n",
"z = x >= y\n",
"print(z)\n",
"print(np.greater_equal(x, y))\n",
"# [[False False False False True]\n",
"# [False False False False True]\n",
"# [False False False True True]\n",
"# [False False False True True]\n",
"# [False False True True True]]\n",
"\n",
"z = x == y\n",
"print(z)\n",
"print(np.equal(x, y))\n",
"# [[False False False False False]\n",
"# [False False False False False]\n",
"# [False False False True False]\n",
"# [False False False False False]\n",
"# [False False False False False]]\n",
"\n",
"z = x != y\n",
"print(z)\n",
"print(np.not_equal(x, y))\n",
"# [[ True True True True True]\n",
"# [ True True True True True]\n",
"# [ True True True False True]\n",
"# [ True True True True True]\n",
"# [ True True True True True]]\n",
"\n",
"z = x < y\n",
"print(z)\n",
"print(np.less(x, y))\n",
"# [[ True True True True False]\n",
"# [ True True True True False]\n",
"# [ True True True False False]\n",
"# [ True True True False False]\n",
"# [ True True False False False]]\n",
"\n",
"z = x <= y\n",
"print(z)\n",
"print(np.less_equal(x, y))\n",
"# [[ True True True True False]\n",
"# [ True True True True False]\n",
"# [ True True True True False]\n",
"# [ True True True False False]\n",
"# [ True True False False False]]\n",
"```\n",
"\n",
"### numpy.isclose\n",
"### numpy.allclose\n",
"- `numpy.isclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False)` Returns a boolean array where two arrays are element-wise equal within a tolerance.\n",
"- `numpy.allclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False)` Returns True if two arrays are element-wise equal within a tolerance. \n",
"\n",
"`numpy.allclose()` 等价于 `numpy.all(isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan))`。\n",
"\n",
"The tolerance values are positive, typically very small numbers. The relative difference (`rtol * abs(b)`) and the absolute difference `atol` are added together to compare against the absolute difference between `a` and `b`.\n",
"\n",
"判断是否为True的计算依据\n",
"\n",
"```python\n",
"np.absolute(a - b) <= (atol + rtol * absolute(b))\n",
"\n",
"- atolfloat绝对公差。\n",
"- rtolfloat相对公差。\n",
"```\n",
"\n",
"NaNs are treated as equal if they are in the same place and if `equal_nan=True`. Infs are treated as equal if they are in the same place and of the same sign in both arrays.\n",
"\n",
"【例】比较两个数组是否可以认为相等。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.isclose([1e10, 1e-7], [1.00001e10, 1e-8])\n",
"print(x) # [ True False]\n",
"\n",
"x = np.allclose([1e10, 1e-7], [1.00001e10, 1e-8])\n",
"print(x) # False\n",
"\n",
"x = np.isclose([1e10, 1e-8], [1.00001e10, 1e-9])\n",
"print(x) # [ True True]\n",
"\n",
"x = np.allclose([1e10, 1e-8], [1.00001e10, 1e-9])\n",
"print(x) # True\n",
"\n",
"x = np.isclose([1e10, 1e-8], [1.0001e10, 1e-9])\n",
"print(x) # [False True]\n",
"\n",
"x = np.allclose([1e10, 1e-8], [1.0001e10, 1e-9])\n",
"print(x) # False\n",
"\n",
"x = np.isclose([1.0, np.nan], [1.0, np.nan])\n",
"print(x) # [ True False]\n",
"\n",
"x = np.allclose([1.0, np.nan], [1.0, np.nan])\n",
"print(x) # False\n",
"\n",
"x = np.isclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)\n",
"print(x) # [ True True]\n",
"\n",
"x = np.allclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)\n",
"print(x) # True\n",
"```\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,715 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 数学函数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**将数组a中大于30的值替换为30小于10的值替换为10。**\n",
"\n",
"- `a = np.random.uniform(1, 50, 20)`\n",
"\n",
"【知识点:数学函数、搜索】\n",
"- 如何将大于给定值的所有值替换为给定的截止值?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:08:51.850958Z",
"start_time": "2020-09-06T03:08:51.759473Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[27.63 14.64 21.8 42.39 1.23 6.96 33.87 41.47 7.7 29.18 44.67 11.25\n",
" 10.08 6.31 11.77 48.95 40.77 9.43 41. 14.43]\n",
"[27.63 14.64 21.8 30. 10. 10. 30. 30. 10. 29.18 30. 11.25\n",
" 10.08 10. 11.77 30. 30. 10. 30. 14.43]\n",
"[27.63 14.64 21.8 30. 10. 10. 30. 30. 10. 29.18 30. 11.25\n",
" 10.08 10. 11.77 30. 30. 10. 30. 14.43]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"np.set_printoptions(precision=2)\n",
"np.random.seed(100)\n",
"a = np.random.uniform(1, 50, 20)\n",
"print(a)\n",
"# [27.63 14.64 21.8 42.39 1.23 6.96 33.87 41.47 7.7 29.18 44.67 11.25\n",
"# 10.08 6.31 11.77 48.95 40.77 9.43 41. 14.43]\n",
"\n",
"# 方法1\n",
"b = np.clip(a, a_min=10, a_max=30)\n",
"print(b)\n",
"# [27.63 14.64 21.8 30. 10. 10. 30. 30. 10. 29.18 30. 11.25\n",
"# 10.08 10. 11.77 30. 30. 10. 30. 14.43]\n",
"\n",
"# 方法2\n",
"b = np.where(a < 10, 10, a)\n",
"b = np.where(b > 30, 30, b)\n",
"print(b)\n",
"# [27.63 14.64 21.8 30. 10. 10. 30. 30. 10. 29.18 30. 11.25\n",
"# 10.08 10. 11.77 30. 30. 10. 30. 14.43]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:21:06.830747Z",
"start_time": "2020-09-06T03:21:06.825756Z"
}
},
"source": [
"\n",
"**找到一个一维数字数组a中的所有峰值。峰顶是两边被较小数值包围的点。**\n",
"\n",
"- `a = np.array([1, 3, 7, 1, 2, 6, 0, 1])`\n",
"\n",
"【知识点:数学函数、搜索】\n",
"- 如何在一维数组中找到所有的局部极大值(或峰值)?"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:21:25.424045Z",
"start_time": "2020-09-06T03:21:25.417035Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 2 4 -6 1 4 -6 1]\n",
"[ 1 1 -1 1 1 -1 1]\n",
"[ 0 -2 2 0 -2 2]\n",
"[2 5]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.array([1, 3, 7, 1, 2, 6, 0, 1])\n",
"b1 = np.diff(a)\n",
"b2 = np.sign(b1)\n",
"b3 = np.diff(b2)\n",
"\n",
"print(b1) # [ 2 4 -6 1 4 -6 1]\n",
"print(b2) # [ 1 1 -1 1 1 -1 1]\n",
"print(b3) # [ 0 -2 2 0 -2 2]\n",
"index = np.where(np.equal(b3, -2))[0] + 1\n",
"print(index) # [2 5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**对于给定的一维数组计算窗口大小为3的移动平均值。**\n",
"\n",
"- `z = np.random.randint(10, size=10)`\n",
"\n",
"【知识点:数学函数】\n",
"- 如何计算numpy数组的移动平均值"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:23:59.067424Z",
"start_time": "2020-09-06T03:23:59.062437Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[8 8 3 7 7 0 4 2 5 2]\n",
"[6.33 6. 5.67 4.67 3.67 2. 3.67 3. ]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"z = np.random.randint(10, size=10)\n",
"print(z)\n",
"# [8 8 3 7 7 0 4 2 5 2]\n",
"\n",
"def MovingAverage(arr, n=3):\n",
" a = np.cumsum(arr)\n",
" a[n:] = a[n:] - a[:-n]\n",
" return a[n - 1:] / n\n",
"\n",
"\n",
"r = MovingAverage(z, 3)\n",
"print(np.around(r, 2))\n",
"# [6.33 6. 5.67 4.67 3.67 2. 3.67 3. ]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:26:27.187954Z",
"start_time": "2020-09-14T09:26:27.183972Z"
}
},
"source": [
"**对一个5x5的随机矩阵做归一化**\n",
"\n",
"【知识点:数学函数】\n",
"- (提示: (x - min) / (max - min))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:26:59.520324Z",
"start_time": "2020-09-14T09:26:59.515666Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0.65852707 0.23160203 0.9700425 0.43393441 0.36950354]\n",
" [0.58585632 0.01877358 0. 0.27782335 0.89654906]\n",
" [0.71307774 0.32030221 0.55187887 0.01411576 0.38903753]\n",
" [0.05702349 0.40824762 0.23277188 0.74335934 0.72125366]\n",
" [0.59816442 0.98727663 1. 0.86466287 0.42760849]]\n"
]
}
],
"source": [
"Z = np.random.random((5,5))\n",
"Zmax, Zmin = Z.max(), Z.min()\n",
"Z = (Z - Zmin)/(Zmax - Zmin)\n",
"print(Z)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**用五种不同的方法去提取一个随机数组的整数部分**\n",
"\n",
"【知识点:数学函数】\n",
"\n",
"- (提示: %, np.floor, np.ceil, astype, np.trunc)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:31:37.950320Z",
"start_time": "2020-09-14T09:31:37.944304Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[8. 5. 5. 1. 2. 7. 0. 1. 5. 9.]\n",
"[8. 5. 5. 1. 2. 7. 0. 1. 5. 9.]\n",
"[8. 5. 5. 1. 2. 7. 0. 1. 5. 9.]\n",
"[8 5 5 1 2 7 0 1 5 9]\n",
"[8. 5. 5. 1. 2. 7. 0. 1. 5. 9.]\n"
]
}
],
"source": [
"Z = np.random.uniform(0,10,10)\n",
"\n",
"print (Z - Z%1)\n",
"print (np.floor(Z))\n",
"print (np.ceil(Z)-1)\n",
"print (Z.astype(int))\n",
"print (np.trunc(Z))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**考虑一维数组Z构建一个二维数组其第一行为Z [0]Z [1]Z [2]随后的每一行都移位1最后一行应为Z [ -3]Z [-2]Z [-1]**\n",
"\n",
"【知识点:数学函数】\n",
"\n",
"- 提示np.lib.stride_tricks"
]
},
{
"attachments": {
"image.png": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAKcAAAC9CAYAAADWW20RAAAOCElEQVR4Ae2da3LkKgyFvcZUzYZSvZXOUjoLyY8sgynwi4cEAmyjtM+tuhUbgwyHr2UMaDwZ/AcFlCowKa0XqgUFDOAEBGoVAJxquwYVA5xgQK0CgFNt16Bih8P5+/Vhpmna//98JSpL8iSF1Cb8muc/r73TZD6+ftXW9i9V7AQ4H+b5k5fg96ucJ29B8dXvB+A8qHt0wvnzNB+b932Y1PfWtb73xxB7+qxnBJx1nZPJrRDOl3n4j8bvh5mmFkBnO/MQ46PozTmNHJj+0GT54bCAAk5Oyup0dXA6GP49zT5qm8d0LAzFJltIW+Gc7/34Dm+SAOtfBpy+Gl3HyuCkQUyBrWlzP5yT7zmNMYCzRv/2vMrgnB/FsacyzY92K0wPnLSwr8/JJHVcs8Jzrkp0/9UF5zKeSzpeE5y2jsGwI+oDwBkJ0n4KOKu0e5lHDkxrC3BWKZrLrAtO9wgmHpkqPKcdHghmDQBnjreqa8rg1PZCtGopBNNmB5yraN1/lcG5vAkHj04aWHnLe1+IaDBfX/50l1cbwOmJ0XeoDs757dpbn+56pBtjuJcsoW6vT+JRbm1G00ubOcC5SdF7oBBO2yTrrdbNFAQcolb7NlZbtZPxlI3ZFrsoADhFvSPJdAKc2JXEgivpEeTZFDgczs0yDqBApwKAs1NAFD9PAcB5nraw3KkA4OwUEMXPUwBwnqctLHcqADg7BUTx8xQYAqfbD7nNY04m3i95XnPPsDyvYPlBfZhKOkbnQXAiwO2Y7ntvK6rhvDQwLdPPdnPx7hkLq0xYIcooWXdJIZz+kmEBhExbk1CKZY299pFrwfTLzEOSzJIq4Mz0St0lhXCuDbCQtsI5jwPjHfUJsOutMn+d1ww2edC2NxOAc5Oi9+Ct4YxftFrgTAW2cGZ+NIAzlawx5U3hpNXIBqbRRZLUIuCAM9GsNeE+cJYC0woKzmNNwbQX4CwoKb98EzgFgWlSzdzmZzzWpXL15LsBnPbFKvN23aBe9tEOz9mgKF3kzeE8Hkwno/WeQZyTJy7g9MToO3xjOGkw2cA0UsdlaTKYSqKC8LzCgNMTo+9QL5xXB6aROs5w+pPwxYA5wEkq2ZKoEE7r8fzlQnuceQEhW03ZKASmkXZs4uI9tzoV6gI4WSVrLwyCsxwEV9uQcfljeMPlznH1+vt3HgLn35cNLbhCAcB5hcq4R5MCgLNJNhS6QgHAeYXKuEeTAoCzSTYUukIBwHmFyrhHkwJD4Nx2+Kxzh9EKTFNLhhXCVNJZ0g+CEwFuZ3XoO9lVCWfsWYPlwwr1qwLThHbjmKKkGFaIEklaE9TBmWxHuyowTaKg28tZWAECnBIlRXmUwTmP34YEphXl2seWWU8OOItKSjOohHNIYFpBMevRP75e7vPVgLMg1kGXlcFJt+qSwDT61nPqFn80e0/AmRPruGv64dzAaGv09nLVPF1lgVzDPABnWy+0lVIO54WBaYx+Fu59DAw4GZlOSVYMJx1m0aNCMhNQNPYyj8DjAs6iZAdmUArn8WA6zXKBaZSoy9TR/o94hTv0d4/qFcbbuidG36FCOGkwTw9ME+kIzymS6aBM6uCs/mIaKQQBUWfA3Hwbwm58f3jOWJHmc2VwDgxMK0i4vfWvm1W4oDvAWVBSfnkQnAhwk3fRfXMOgfO+cqPlNQoAzhq1kPdSBQDnpXLjZjUKAM4atZD3UgUA56Vy42Y1CgDOGrWQ91IFhsCZzBkG69eXtv+Am80T8/4SZ3ZL3QF3vIuJQXAiwO0ugPW0UyWcQwLTOBWXZU/fM9pj1jtihYhTsjpdHZxxdOM8BFg3+1a3by4gCUzjTP88zfObu0ikA05ClLYklXCGMUTzmI7cniZq8z4mZL1dzg7gzKlz6jV1cKattXAV/jXhtNCWYj2vKDBtKxEdfD+8nfDRNeoUnpNSpSlNPZzusd76Nr/FH83es8lzfj/N8yfcLZW1AzibQKQKqYVzm25qBdP9W+7rWLUHzoeZgu8YzaCywwzASXHWlKYWzq017mWm/rFu4d4B6oBzq8h+kPXmgHMXqvNIP5z2exZfHyZ8SSq1uiEwrWTSv56LRQKcvlJdx38CTpODgWr+MnUUz02u57tHpQr7abPHTX4YufoATl/ArmNlcNIwOM/Jfc5P1PzWxzo9vsx6csAp6hFJJpVwBm/DVwWmMWpZENP6ZMbAgJNRsj5ZGZy2AYv3LAWSCdvqvNxmq+VrcMuY17ORHRYATmHPlLMNghMBbuWuQY4hcEJ2KCBRAHBKVEKeIQoAziGy46YSBQCnRCXkGaIA4BwiO24qUQBwSlRCniEKDIEzmXts3nk0RLPopvG8bCaEIyqJ07wCg+BEgFu+W3DVKqAezjimSNxttYFpBcNB0F1unR8rRAUl5Zd1w7nsLgrWtqVtq439Ye3Gm0bmzSBsnQAnq2TtBcVw7mM5FoRca4+C0/5AasbEgDPXK1XX1MI57wYSfDGNa25tYBppJ/aaZKYwEXCGenSc6YRzRGAaKeK+nzMYc+Y8KeAklWxJVAin9VYDAtMo9ZaXqo9/FfFIgJNSsilNHZz2cb7vl2x4rGZkcPOrOa8Xl13h/PoNryBMI9TjpDNlcA4MTKMEXuDcfyxLJpe+eveoIDxnJEj7qS44l6mjNRAt/ptAwrZ7edOPvWTO45G29jFncBlwBnKcdaILzqSVrY91Gqrqx7oxxr0I1UAOz5n0YmvCm8I5x/0E86PO22UC0zgFl0f7bmv+wbBeHHBySlanq4XTeTkvqGzivpiWaXJsgwUqY8NdWgBdhxlZO4CzpKb4+iA4EeAm7qEbZxwC5431RtMrFACcFWIh67UKAM5r9cbdKhQAnBViIeu1CgDOa/XG3SoUAJwVYiHrtQoMgTOef6zazHutPoK7LUul3pzsPmEvKI4srAKD4ESAG9sjuLApoA/OaDVmXZVp9UbBJuFcYNomSXiQePnNQ2JXUqjU8Wcq4az6YhqrSbxppBCYxth5fRLr8bkQECxfMkrWJ78vnLWBaaR2v+b59Yqu/Jrn59NE24/3PIBz16LzSB+cOa8kbmzsNcUFyxlL9QOcZQ2FORTCWfnFNLKh+37OYMwZ78sky+YSC17TFgWcOQGrrimEs/KLaVRz1z2YNYFplJ04TQKeJE9sF+ekAvrgJKrp3phrvN4KZ01gGnHfMMkOFYiXozATPGesR8f5n4Cz+iNZC5zJpmCXzkwBlUS0ZSVTUfCcJSXF15XBuay2xF7yisC0gmTOewPOgkrHXlYG5/4i4zez+rHeEpjm35A4di9WgJNQ5rwkZXAODEzLarx4dMCZVenoi+rgtA2MlwyTsaNUhWXsuS6BNttZPTHglCp/SL5BcCLA7ZDee3MjQ+B8c03RvIMUAJwHCQkzxysAOI/XFBYPUgBwHiQkzByvAOA8XlNYPEgBwHmQkDBzvAJD4IznMRHgdnzHvoPFQXAiwO0d4Dm7DWrhDDYJS1ZmIqUS71wKTIvK+6exrWywHXYl+dJ1HSuEMw6xuCgwjZHRgRn8OOL6RQUBZyRI+6k+OEcFppEaWhCJDca5LXyAk1SyJVEZnAWv1NLCtUwpMG3NF/yd65NsGLEbSuI9p2s5wLkq0f1XGZz7fs5gzMmBIG6+IDCNs2W9ZPBPfjPedC0POFcluv/qgnPZ4lb1xTSJBL3ABFvviMe8X4fee/m2bn6sE84RgWksCC/zWF+IVkjXc6oM4KRUaUpTCSc5xptODkwj5bOP8PS+bsjBDTUAJ6lkS6IuOM0+5gwa4zxWCkmQhzlJp4KYjFSyvS/lJbl0awNwUko2pSmDs+GLaYVmiwPTKDvcjwJwUmodnqYOTuOAmMy+CsNM54ikmMtOlPcTlad+LLPNvX6RIXjOSJD2U31w2rYsgF4amJbRMJjWmvwfDlEIcBKitCUNghMBbm3dda9SQ+C8l8RobasCgLNVOZQ7XQHAebrEuEGrAoCzVTmUO10BwHm6xLhBqwKAs1U5lDtdgSFwxmEP7x/gtiwGbKEihbnS07v9b9xgEJw3D3DDRL3o16EOzsSrbt6mfuNHbItdcixIFdo5YD8n4CwoPl9WB2f1F9OYZjqggjX1wpq41I5bWs0AKgFPkoepz52SlcHZ8MU0srcsiARAucA00o7dwpfa6d7PCThJteNEZXDG1Zv3Ryabj4lsYdLsJZNy1utxm4RDA/OZ85LEcCIHuQQ8SR6qPjdLUw7nhYFpVMfn4OR25kvAk+Sh6nOzNN1w9naig2sy89a79PFc7uvMYx1wluXrzKEYTmbcKG5wZWAaYzfeSW9ftB6f8ScQvcKSH5Qkj2fyrod64bReL3jbrukiC3Y6Vsy+yLDm5/HruvHZTkelMwFeYQl4kjyeybseqoUzC0CptziwufSSvei6hZydM5WAJ8kT3fOOp2rhjB+nVZ3jxpqp53ThH83eeK0BPQ5dr4qiLwHnJlfuQCmcy6O0A6T0ET7bZD0eo5Lz4NvLz1Kv3HSUBDxJHqY+d0pWCucS9dgBp+1EB+i2/Jl5FOd63Hnh9Y1fYEMCniRPrk43uTYIzrsFuIUvVfblqtaD34THoJlD4AxqgBMowCgAOBlhkDxeAcA5vg9QA0YBwMkIg+TxCgDO8X2AGjAKAE5GGCSPVwBwju8D1IBRAHAywiB5vAKAc3wfoAaMAoCTEQbJ4xUAnOP7ADVgFACcjDBIHq8A4BzfB6gBowDgZIRB8ngFAOf4PkANGAUAJyMMkscrADjH9wFqwCgAOBlhkDxeAcA5vg9QA0YBwMkIg+TxCgDO8X2AGjAK/AfMSn4HhuLGrAAAAABJRU5ErkJggg=="
}
},
"cell_type": "markdown",
"metadata": {},
"source": [
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]--------> ![image.png](attachment:image.png) "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T13:38:56.805424Z",
"start_time": "2020-09-14T13:38:56.800436Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"4"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.arange(10).itemsize"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T13:32:50.080815Z",
"start_time": "2020-09-14T13:32:49.737937Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0 1 2]\n",
" [1 2 3]\n",
" [2 3 4]\n",
" [3 4 5]\n",
" [4 5 6]\n",
" [5 6 7]\n",
" [6 7 8]\n",
" [7 8 9]]\n"
]
}
],
"source": [
"from numpy.lib import stride_tricks\n",
"def rolling(a, window):\n",
" shape = (a.size - window + 1, window)\n",
" strides = (a.itemsize, a.itemsize)\n",
" return stride_tricks.as_strided(a, shape=shape, strides=strides)\n",
"Z = rolling(np.arange(10), 3)\n",
"print (Z)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**考虑两组点集P0和P1去描述一组线(二维)和一个点p,如何计算点p到每一条线 i (P0[i],P1[i])的距离?**\n",
"\n",
"【知识点:数学函数】\n",
"- 提示 设P(x0,y0)直线方程为Ax+By+C=0\n",
"则P到直线的距离为:d=|Ax0+By0+C|/√(A²+B²)\n"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T05:37:30.811695Z",
"start_time": "2020-09-15T05:37:30.805709Z"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"def distance(P0,P1,p):\n",
" A=-1/(P1[:,0]-P0[:,0])\n",
" B=1/(P1[:,1]-P0[:,1])\n",
" C=P0[:,0]/(P1[:,0]-P0[:,0])-P0[:,1]/(P1[:,1]-P0[:,1])\n",
" return np.abs(A*p[:,0]+B*p[:,1]+C)/np.sqrt(A**2+B**2)"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T05:37:37.692332Z",
"start_time": "2020-09-15T05:37:37.687379Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 2.41120585 7.05924485 5.94906338 3.89096895 7.68364539 14.01851392\n",
" 4.28148124 2.29582076 6.19155339 15.55087594]\n"
]
}
],
"source": [
"P0 = np.random.uniform(-10,10,(10,2))\n",
"P1 = np.random.uniform(-10,10,(10,2))\n",
"p = np.random.uniform(-10,10,( 1,2))\n",
"\n",
"print (distance(P0, P1, p))"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:33:06.525406Z",
"start_time": "2020-09-06T02:33:06.520453Z"
}
},
"source": [
"## 逻辑函数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**获取a和b元素匹配的位置。**\n",
"- `a = np.array([1, 2, 3, 2, 3, 4, 3, 4, 5, 6])`\n",
"- `b = np.array([7, 2, 10, 2, 7, 4, 9, 4, 9, 8])`\n",
"\n",
"【知识点:逻辑函数】\n",
"- 如何得到两个数组元素匹配的位置?"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:53:59.537622Z",
"start_time": "2020-09-06T02:53:59.531638Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(array([1, 3, 5, 7], dtype=int64),)\n",
"(array([1, 3, 5, 7], dtype=int64),)\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 2, 3, 4, 3, 4, 5, 6])\n",
"b = np.array([7, 2, 10, 2, 7, 4, 9, 4, 9, 8])\n",
"mask = np.equal(a, b)\n",
"\n",
"# 方法1\n",
"x = np.where(mask)\n",
"print(x) # (array([1, 3, 5, 7], dtype=int64),)\n",
"\n",
"# 方法2\n",
"x = np.nonzero(mask)\n",
"print(x) # (array([1, 3, 5, 7], dtype=int64),)"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:54:19.320517Z",
"start_time": "2020-09-06T02:54:19.315496Z"
}
},
"source": [
"**获取5到10 之间的所有元素。**\n",
"- `a = np.array([2, 6, 1, 9, 10, 3, 27])`\n",
"\n",
"【知识点:逻辑函数】\n",
"- 如何从numpy数组中提取给定范围内的所有元素"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:55:11.162117Z",
"start_time": "2020-09-06T02:55:11.156161Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 6 9 10]\n",
"[ 6 9 10]\n",
"[ 6 9 10]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.array([2, 6, 1, 9, 10, 3, 27])\n",
"mask = np.logical_and(np.greater_equal(a, 5), np.less_equal(a, 10))\n",
"\n",
"# 方法1\n",
"x = np.where(mask)\n",
"print(a[x]) # [ 6 9 10]\n",
"\n",
"# 方法2\n",
"x = np.nonzero(mask)\n",
"print(a[x]) # [ 6 9 10]\n",
"\n",
"# 方法3\n",
"x = a[np.logical_and(a >= 5, a <= 10)]\n",
"print(x) # [ 6 9 10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**对于两个随机数组A和B,检查他们是否相等**\n",
"\n",
"【知识点:逻辑函数】\n",
"\n",
"- (提示: np.allclose, np.array_equal)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:35:57.408576Z",
"start_time": "2020-09-14T09:35:57.404623Z"
}
},
"outputs": [],
"source": [
"A = np.random.randint(0,2,5)\n",
"B = np.random.randint(0,2,5)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:35:58.285123Z",
"start_time": "2020-09-14T09:35:58.280479Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"False\n"
]
}
],
"source": [
"\n",
"# Assuming identical shape of the arrays and a tolerance for the comparison of values\n",
"equal = np.allclose(A,B)\n",
"print(equal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**何对布尔值取反,或者原位(in-place)改变浮点数的符号(sign)**\n",
"\n",
"【知识点:逻辑函数】\n",
"- (提示: np.logical_not, np.negative)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T14:05:59.290471Z",
"start_time": "2020-09-14T14:05:59.284521Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 1]\n"
]
},
{
"data": {
"text/plain": [
"array([1, 0])"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Z = np.array([0,1])\n",
"print(Z)\n",
"np.logical_not(Z, out=Z)\n",
"# Z = np.random.uniform(-1.0,1.0,100)\n",
"\n",
"# np.negative(Z, out=Z)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T14:08:05.101330Z",
"start_time": "2020-09-14T14:08:05.096343Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.2 1.15]\n"
]
},
{
"data": {
"text/plain": [
"array([-0.2 , -1.15])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Z = np.array([0.2,1.15])\n",
"print(Z)\n",
"np.negative(Z, out=Z)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "224.2px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,227 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 数学函数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **将数组a中大于30的值替换为30小于10的值替换为10。**\n",
"\n",
"- `a = np.random.uniform(1, 50, 20)`\n",
"\n",
"【知识点:数学函数、搜索】\n",
"- 如何将大于给定值的所有值替换为给定的截止值?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **找到一个一维数字数组a中的所有峰值。峰顶是两边被较小数值包围的点。**\n",
"\n",
"- `a = np.array([1, 3, 7, 1, 2, 6, 0, 1])`\n",
"\n",
"【知识点:数学函数、搜索】\n",
"- 如何在一维数组中找到所有的局部极大值(或峰值)?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **对于给定的一维数组计算窗口大小为3的移动平均值。**\n",
"\n",
"- `z = np.random.randint(10, size=10)`\n",
"\n",
"【知识点:数学函数】\n",
"- 如何计算numpy数组的移动平均值"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **对一个5x5的随机矩阵做归一化**\n",
"\n",
"-`Z = np.random.random((5,5))` \n",
"\n",
"【知识点:数学函数】\n",
"- (提示: (x - min) / (max - min))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **用五种不同的方法去提取一个随机数组的整数部分**\n",
"\n",
"- `Z = np.random.uniform(0,10,10) `\n",
"\n",
"【知识点:数学函数】\n",
"\n",
"- (提示: %, np.floor, np.ceil, astype, np.trunc)"
]
},
{
"attachments": {
"image.png": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAKcAAAC9CAYAAADWW20RAAAOCElEQVR4Ae2da3LkKgyFvcZUzYZSvZXOUjoLyY8sgynwi4cEAmyjtM+tuhUbgwyHr2UMaDwZ/AcFlCowKa0XqgUFDOAEBGoVAJxquwYVA5xgQK0CgFNt16Bih8P5+/Vhpmna//98JSpL8iSF1Cb8muc/r73TZD6+ftXW9i9V7AQ4H+b5k5fg96ucJ29B8dXvB+A8qHt0wvnzNB+b932Y1PfWtb73xxB7+qxnBJx1nZPJrRDOl3n4j8bvh5mmFkBnO/MQ46PozTmNHJj+0GT54bCAAk5Oyup0dXA6GP49zT5qm8d0LAzFJltIW+Gc7/34Dm+SAOtfBpy+Gl3HyuCkQUyBrWlzP5yT7zmNMYCzRv/2vMrgnB/FsacyzY92K0wPnLSwr8/JJHVcs8Jzrkp0/9UF5zKeSzpeE5y2jsGwI+oDwBkJ0n4KOKu0e5lHDkxrC3BWKZrLrAtO9wgmHpkqPKcdHghmDQBnjreqa8rg1PZCtGopBNNmB5yraN1/lcG5vAkHj04aWHnLe1+IaDBfX/50l1cbwOmJ0XeoDs757dpbn+56pBtjuJcsoW6vT+JRbm1G00ubOcC5SdF7oBBO2yTrrdbNFAQcolb7NlZbtZPxlI3ZFrsoADhFvSPJdAKc2JXEgivpEeTZFDgczs0yDqBApwKAs1NAFD9PAcB5nraw3KkA4OwUEMXPUwBwnqctLHcqADg7BUTx8xQYAqfbD7nNY04m3i95XnPPsDyvYPlBfZhKOkbnQXAiwO2Y7ntvK6rhvDQwLdPPdnPx7hkLq0xYIcooWXdJIZz+kmEBhExbk1CKZY299pFrwfTLzEOSzJIq4Mz0St0lhXCuDbCQtsI5jwPjHfUJsOutMn+d1ww2edC2NxOAc5Oi9+Ct4YxftFrgTAW2cGZ+NIAzlawx5U3hpNXIBqbRRZLUIuCAM9GsNeE+cJYC0woKzmNNwbQX4CwoKb98EzgFgWlSzdzmZzzWpXL15LsBnPbFKvN23aBe9tEOz9mgKF3kzeE8Hkwno/WeQZyTJy7g9MToO3xjOGkw2cA0UsdlaTKYSqKC8LzCgNMTo+9QL5xXB6aROs5w+pPwxYA5wEkq2ZKoEE7r8fzlQnuceQEhW03ZKASmkXZs4uI9tzoV6gI4WSVrLwyCsxwEV9uQcfljeMPlznH1+vt3HgLn35cNLbhCAcB5hcq4R5MCgLNJNhS6QgHAeYXKuEeTAoCzSTYUukIBwHmFyrhHkwJD4Nx2+Kxzh9EKTFNLhhXCVNJZ0g+CEwFuZ3XoO9lVCWfsWYPlwwr1qwLThHbjmKKkGFaIEklaE9TBmWxHuyowTaKg28tZWAECnBIlRXmUwTmP34YEphXl2seWWU8OOItKSjOohHNIYFpBMevRP75e7vPVgLMg1kGXlcFJt+qSwDT61nPqFn80e0/AmRPruGv64dzAaGv09nLVPF1lgVzDPABnWy+0lVIO54WBaYx+Fu59DAw4GZlOSVYMJx1m0aNCMhNQNPYyj8DjAs6iZAdmUArn8WA6zXKBaZSoy9TR/o94hTv0d4/qFcbbuidG36FCOGkwTw9ME+kIzymS6aBM6uCs/mIaKQQBUWfA3Hwbwm58f3jOWJHmc2VwDgxMK0i4vfWvm1W4oDvAWVBSfnkQnAhwk3fRfXMOgfO+cqPlNQoAzhq1kPdSBQDnpXLjZjUKAM4atZD3UgUA56Vy42Y1CgDOGrWQ91IFhsCZzBkG69eXtv+Am80T8/4SZ3ZL3QF3vIuJQXAiwO0ugPW0UyWcQwLTOBWXZU/fM9pj1jtihYhTsjpdHZxxdOM8BFg3+1a3by4gCUzjTP88zfObu0ikA05ClLYklXCGMUTzmI7cniZq8z4mZL1dzg7gzKlz6jV1cKattXAV/jXhtNCWYj2vKDBtKxEdfD+8nfDRNeoUnpNSpSlNPZzusd76Nr/FH83es8lzfj/N8yfcLZW1AzibQKQKqYVzm25qBdP9W+7rWLUHzoeZgu8YzaCywwzASXHWlKYWzq017mWm/rFu4d4B6oBzq8h+kPXmgHMXqvNIP5z2exZfHyZ8SSq1uiEwrWTSv56LRQKcvlJdx38CTpODgWr+MnUUz02u57tHpQr7abPHTX4YufoATl/ArmNlcNIwOM/Jfc5P1PzWxzo9vsx6csAp6hFJJpVwBm/DVwWmMWpZENP6ZMbAgJNRsj5ZGZy2AYv3LAWSCdvqvNxmq+VrcMuY17ORHRYATmHPlLMNghMBbuWuQY4hcEJ2KCBRAHBKVEKeIQoAziGy46YSBQCnRCXkGaIA4BwiO24qUQBwSlRCniEKDIEzmXts3nk0RLPopvG8bCaEIyqJ07wCg+BEgFu+W3DVKqAezjimSNxttYFpBcNB0F1unR8rRAUl5Zd1w7nsLgrWtqVtq439Ye3Gm0bmzSBsnQAnq2TtBcVw7mM5FoRca4+C0/5AasbEgDPXK1XX1MI57wYSfDGNa25tYBppJ/aaZKYwEXCGenSc6YRzRGAaKeK+nzMYc+Y8KeAklWxJVAin9VYDAtMo9ZaXqo9/FfFIgJNSsilNHZz2cb7vl2x4rGZkcPOrOa8Xl13h/PoNryBMI9TjpDNlcA4MTKMEXuDcfyxLJpe+eveoIDxnJEj7qS44l6mjNRAt/ptAwrZ7edOPvWTO45G29jFncBlwBnKcdaILzqSVrY91Gqrqx7oxxr0I1UAOz5n0YmvCm8I5x/0E86PO22UC0zgFl0f7bmv+wbBeHHBySlanq4XTeTkvqGzivpiWaXJsgwUqY8NdWgBdhxlZO4CzpKb4+iA4EeAm7qEbZxwC5431RtMrFACcFWIh67UKAM5r9cbdKhQAnBViIeu1CgDOa/XG3SoUAJwVYiHrtQoMgTOef6zazHutPoK7LUul3pzsPmEvKI4srAKD4ESAG9sjuLApoA/OaDVmXZVp9UbBJuFcYNomSXiQePnNQ2JXUqjU8Wcq4az6YhqrSbxppBCYxth5fRLr8bkQECxfMkrWJ78vnLWBaaR2v+b59Yqu/Jrn59NE24/3PIBz16LzSB+cOa8kbmzsNcUFyxlL9QOcZQ2FORTCWfnFNLKh+37OYMwZ78sky+YSC17TFgWcOQGrrimEs/KLaVRz1z2YNYFplJ04TQKeJE9sF+ekAvrgJKrp3phrvN4KZ01gGnHfMMkOFYiXozATPGesR8f5n4Cz+iNZC5zJpmCXzkwBlUS0ZSVTUfCcJSXF15XBuay2xF7yisC0gmTOewPOgkrHXlYG5/4i4zez+rHeEpjm35A4di9WgJNQ5rwkZXAODEzLarx4dMCZVenoi+rgtA2MlwyTsaNUhWXsuS6BNttZPTHglCp/SL5BcCLA7ZDee3MjQ+B8c03RvIMUAJwHCQkzxysAOI/XFBYPUgBwHiQkzByvAOA8XlNYPEgBwHmQkDBzvAJD4IznMRHgdnzHvoPFQXAiwO0d4Dm7DWrhDDYJS1ZmIqUS71wKTIvK+6exrWywHXYl+dJ1HSuEMw6xuCgwjZHRgRn8OOL6RQUBZyRI+6k+OEcFppEaWhCJDca5LXyAk1SyJVEZnAWv1NLCtUwpMG3NF/yd65NsGLEbSuI9p2s5wLkq0f1XGZz7fs5gzMmBIG6+IDCNs2W9ZPBPfjPedC0POFcluv/qgnPZ4lb1xTSJBL3ABFvviMe8X4fee/m2bn6sE84RgWksCC/zWF+IVkjXc6oM4KRUaUpTCSc5xptODkwj5bOP8PS+bsjBDTUAJ6lkS6IuOM0+5gwa4zxWCkmQhzlJp4KYjFSyvS/lJbl0awNwUko2pSmDs+GLaYVmiwPTKDvcjwJwUmodnqYOTuOAmMy+CsNM54ikmMtOlPcTlad+LLPNvX6RIXjOSJD2U31w2rYsgF4amJbRMJjWmvwfDlEIcBKitCUNghMBbm3dda9SQ+C8l8RobasCgLNVOZQ7XQHAebrEuEGrAoCzVTmUO10BwHm6xLhBqwKAs1U5lDtdgSFwxmEP7x/gtiwGbKEihbnS07v9b9xgEJw3D3DDRL3o16EOzsSrbt6mfuNHbItdcixIFdo5YD8n4CwoPl9WB2f1F9OYZjqggjX1wpq41I5bWs0AKgFPkoepz52SlcHZ8MU0srcsiARAucA00o7dwpfa6d7PCThJteNEZXDG1Zv3Ryabj4lsYdLsJZNy1utxm4RDA/OZ85LEcCIHuQQ8SR6qPjdLUw7nhYFpVMfn4OR25kvAk+Sh6nOzNN1w9naig2sy89a79PFc7uvMYx1wluXrzKEYTmbcKG5wZWAaYzfeSW9ftB6f8ScQvcKSH5Qkj2fyrod64bReL3jbrukiC3Y6Vsy+yLDm5/HruvHZTkelMwFeYQl4kjyeybseqoUzC0CptziwufSSvei6hZydM5WAJ8kT3fOOp2rhjB+nVZ3jxpqp53ThH83eeK0BPQ5dr4qiLwHnJlfuQCmcy6O0A6T0ET7bZD0eo5Lz4NvLz1Kv3HSUBDxJHqY+d0pWCucS9dgBp+1EB+i2/Jl5FOd63Hnh9Y1fYEMCniRPrk43uTYIzrsFuIUvVfblqtaD34THoJlD4AxqgBMowCgAOBlhkDxeAcA5vg9QA0YBwMkIg+TxCgDO8X2AGjAKAE5GGCSPVwBwju8D1IBRAHAywiB5vAKAc3wfoAaMAoCTEQbJ4xUAnOP7ADVgFACcjDBIHq8A4BzfB6gBowDgZIRB8ngFAOf4PkANGAUAJyMMkscrADjH9wFqwCgAOBlhkDxeAcA5vg9QA0YBwMkIg+TxCgDO8X2AGjAK/AfMSn4HhuLGrAAAAABJRU5ErkJggg=="
}
},
"cell_type": "markdown",
"metadata": {},
"source": [
"### **考虑一维数组Z构建一个二维数组其第一行为Z [0]Z [1]Z [2]随后的每一行都移位1最后一行应为Z [ -3]Z [-2]Z [-1]**\n",
"\n",
"【知识点:数学函数】\n",
"\n",
"- 提示np.lib.stride_tricks\n",
"\n",
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]--------> ![image.png](attachment:image.png) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **考虑两组点集P0和P1去描述一组线(二维)和一个点p,如何计算点p到每一条线 i (P0[i],P1[i])的距离?**\n",
"- `P0 = np.random.uniform(-10,10,(10,2))\n",
"P1 = np.random.uniform(-10,10,(10,2))\n",
"p = np.random.uniform(-10,10,( 1,2))`\n",
"\n",
"【知识点:数学函数】\n",
"- 提示 设P(x0,y0)直线方程为Ax+By+C=0\n",
"则P到直线的距离为:d=|Ax0+By0+C|/√(A²+B²)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 逻辑函数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **获取a和b元素匹配的位置。**\n",
"- `a = np.array([1, 2, 3, 2, 3, 4, 3, 4, 5, 6])`\n",
"- `b = np.array([7, 2, 10, 2, 7, 4, 9, 4, 9, 8])`\n",
"\n",
"【知识点:逻辑函数】\n",
"- 如何得到两个数组元素匹配的位置?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **获取5到10 之间的所有元素。**\n",
"- `a = np.array([2, 6, 1, 9, 10, 3, 27])`\n",
"\n",
"【知识点:逻辑函数】\n",
"- 如何从numpy数组中提取给定范围内的所有元素"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **对于两个随机数组A和B,检查他们是否相等**\n",
"- `A = np.random.randint(0,2,5)\n",
"B = np.random.randint(0,2,5)`\n",
"\n",
"【知识点:逻辑函数】\n",
"\n",
"- (提示: np.allclose, np.array_equal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **何对布尔值取反,或者原位(in-place)改变浮点数的符号(sign)**\n",
"\n",
"【知识点:逻辑函数】\n",
"- (提示: np.logical_not, np.negative)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,152 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 排序搜索计数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **如何通过第n列对一个数组进行排序**\n",
"- `Z = np.random.randint(0,10,(3,3))`\n",
"\n",
"【知识点:排序】\n",
"\n",
"- (提示: argsort)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **从`arr`中提取所有奇数。**\n",
"\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何从一维数组中提取满足指定条件的元素?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **将`arr`中的偶数元素替换为0。**\n",
"\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何用numpy数组中的另一个值替换满足条件的元素项"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ** 将 `arr` 中的所有偶数元素替换为0而不改变arr。**\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何在不影响原始数组的情况下替换满足条件的元素项?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **获取给定数组a中前5个最大值的位置。**\n",
"\n",
"- `a = np.random.uniform(1, 50, 20)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何从numpy数组中获取最大的n个值的位置"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **删除一维numpy数组中所有NaN值。**\n",
"\n",
"- `a = np.array([1, 2, 3, np.nan, 5, 6, 7, np.nan])`\n",
"\n",
"【知识点:逻辑函数、搜索】\n",
"- 如何删除numpy数组中的缺失值"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 集合操作"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,6 @@
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,828 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 排序,搜索和计数\n",
"## 排序\n",
"\n",
"- `numpy.sort(a[, axis=-1, kind='quicksort', order=None])` Return a sorted **copy** of an array.\n",
" - axis排序沿数组的方向0表示按行1表示按列None表示展开来排序默认为-1表示沿最后的轴排序。\n",
" - kind排序的算法提供了快排'quicksort'、混排'mergesort'、堆排'heapsort' 默认为quicksort'。\n",
" - order排序的字段名可指定字段排序默认为None。\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(20200612)\n",
"x = np.random.rand(5, 5) * 10\n",
"x = np.around(x, 2)\n",
"print(x)\n",
"# [[2.32 7.54 9.78 1.73 6.22]\n",
"# [6.93 5.17 9.28 9.76 8.25]\n",
"# [0.01 4.23 0.19 1.73 9.27]\n",
"# [7.99 4.97 0.88 7.32 4.29]\n",
"# [9.05 0.07 8.95 7.9 6.99]]\n",
"\n",
"y = np.sort(x)\n",
"print(y)\n",
"# [[1.73 2.32 6.22 7.54 9.78]\n",
"# [5.17 6.93 8.25 9.28 9.76]\n",
"# [0.01 0.19 1.73 4.23 9.27]\n",
"# [0.88 4.29 4.97 7.32 7.99]\n",
"# [0.07 6.99 7.9 8.95 9.05]]\n",
"\n",
"y = np.sort(x, axis=0)\n",
"print(y)\n",
"# [[0.01 0.07 0.19 1.73 4.29]\n",
"# [2.32 4.23 0.88 1.73 6.22]\n",
"# [6.93 4.97 8.95 7.32 6.99]\n",
"# [7.99 5.17 9.28 7.9 8.25]\n",
"# [9.05 7.54 9.78 9.76 9.27]]\n",
"\n",
"y = np.sort(x, axis=1)\n",
"print(y)\n",
"# [[1.73 2.32 6.22 7.54 9.78]\n",
"# [5.17 6.93 8.25 9.28 9.76]\n",
"# [0.01 0.19 1.73 4.23 9.27]\n",
"# [0.88 4.29 4.97 7.32 7.99]\n",
"# [0.07 6.99 7.9 8.95 9.05]]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"dt = np.dtype([('name', 'S10'), ('age', np.int)])\n",
"a = np.array([(\"Mike\", 21), (\"Nancy\", 25), (\"Bob\", 17), (\"Jane\", 27)], dtype=dt)\n",
"b = np.sort(a, order='name')\n",
"print(b)\n",
"# [(b'Bob', 17) (b'Jane', 27) (b'Mike', 21) (b'Nancy', 25)]\n",
"\n",
"b = np.sort(a, order='age')\n",
"print(b)\n",
"# [(b'Bob', 17) (b'Mike', 21) (b'Nancy', 25) (b'Jane', 27)]\n",
"```\n",
"\n",
"\n",
"如果排序后,想用元素的索引位置替代排序后的实际结果,该怎么办呢?\n",
"\n",
"- `numpy.argsort(a[, axis=-1, kind='quicksort', order=None])` Returns the indices that would sort an array.\n",
"\n",
"\n",
"\n",
"【例】对数组沿给定轴执行间接排序,并使用指定排序类型返回数据的索引数组。这个索引数组用于构造排序后的数组。\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(20200612)\n",
"x = np.random.randint(0, 10, 10)\n",
"print(x)\n",
"# [6 1 8 5 5 4 1 2 9 1]\n",
"\n",
"y = np.argsort(x)\n",
"print(y)\n",
"# [1 6 9 7 5 3 4 0 2 8]\n",
"\n",
"print(x[y])\n",
"# [1 1 1 2 4 5 5 6 8 9]\n",
"\n",
"y = np.argsort(-x)\n",
"print(y)\n",
"# [8 2 0 3 4 5 7 1 6 9]\n",
"\n",
"print(x[y])\n",
"# [9 8 6 5 5 4 2 1 1 1]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(20200612)\n",
"x = np.random.rand(5, 5) * 10\n",
"x = np.around(x, 2)\n",
"print(x)\n",
"# [[2.32 7.54 9.78 1.73 6.22]\n",
"# [6.93 5.17 9.28 9.76 8.25]\n",
"# [0.01 4.23 0.19 1.73 9.27]\n",
"# [7.99 4.97 0.88 7.32 4.29]\n",
"# [9.05 0.07 8.95 7.9 6.99]]\n",
"\n",
"y = np.argsort(x)\n",
"print(y)\n",
"# [[3 0 4 1 2]\n",
"# [1 0 4 2 3]\n",
"# [0 2 3 1 4]\n",
"# [2 4 1 3 0]\n",
"# [1 4 3 2 0]]\n",
"\n",
"y = np.argsort(x, axis=0)\n",
"print(y)\n",
"# [[2 4 2 0 3]\n",
"# [0 2 3 2 0]\n",
"# [1 3 4 3 4]\n",
"# [3 1 1 4 1]\n",
"# [4 0 0 1 2]]\n",
"\n",
"y = np.argsort(x, axis=1)\n",
"print(y)\n",
"# [[3 0 4 1 2]\n",
"# [1 0 4 2 3]\n",
"# [0 2 3 1 4]\n",
"# [2 4 1 3 0]\n",
"# [1 4 3 2 0]]\n",
"\n",
"y = np.array([np.take(x[i], np.argsort(x[i])) for i in range(5)]) \n",
"#numpy.take(a, indices, axis=None, out=None, mode='raise')沿轴从数组中获取元素。\n",
"print(y)\n",
"# [[1.73 2.32 6.22 7.54 9.78]\n",
"# [5.17 6.93 8.25 9.28 9.76]\n",
"# [0.01 0.19 1.73 4.23 9.27]\n",
"# [0.88 4.29 4.97 7.32 7.99]\n",
"# [0.07 6.99 7.9 8.95 9.05]]\n",
"```\n",
"\n",
"如何将数据按照某一指标进行排序呢?\n",
"\n",
"- `numpy.lexsort(keys[, axis=-1])` Perform an indirect stable sort using a sequence of keys.(使用键序列执行间接稳定排序。)\n",
"\n",
"- 给定多个可以在电子表格中解释为列的排序键lexsort返回一个整数索引数组该数组描述了按多个列排序的顺序。序列中的最后一个键用于主排序顺序倒数第二个键用于辅助排序顺序依此类推。keys参数必须是可以转换为相同形状的数组的对象序列。如果为keys参数提供了2D数组则将其行解释为排序键并根据最后一行倒数第二行等进行排序。\n",
"\n",
"\n",
"\n",
"【例】按照第一列的升序或者降序对整体数据进行排序。\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(20200612)\n",
"x = np.random.rand(5, 5) * 10\n",
"x = np.around(x, 2)\n",
"print(x)\n",
"# [[2.32 7.54 9.78 1.73 6.22]\n",
"# [6.93 5.17 9.28 9.76 8.25]\n",
"# [0.01 4.23 0.19 1.73 9.27]\n",
"# [7.99 4.97 0.88 7.32 4.29]\n",
"# [9.05 0.07 8.95 7.9 6.99]]\n",
"\n",
"index = np.lexsort([x[:, 0]])\n",
"print(index)\n",
"# [2 0 1 3 4]\n",
"\n",
"y = x[index]\n",
"print(y)\n",
"# [[0.01 4.23 0.19 1.73 9.27]\n",
"# [2.32 7.54 9.78 1.73 6.22]\n",
"# [6.93 5.17 9.28 9.76 8.25]\n",
"# [7.99 4.97 0.88 7.32 4.29]\n",
"# [9.05 0.07 8.95 7.9 6.99]]\n",
"\n",
"index = np.lexsort([-1 * x[:, 0]])\n",
"print(index)\n",
"# [4 3 1 0 2]\n",
"\n",
"y = x[index]\n",
"print(y)\n",
"# [[9.05 0.07 8.95 7.9 6.99]\n",
"# [7.99 4.97 0.88 7.32 4.29]\n",
"# [6.93 5.17 9.28 9.76 8.25]\n",
"# [2.32 7.54 9.78 1.73 6.22]\n",
"# [0.01 4.23 0.19 1.73 9.27]]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 5, 1, 4, 3, 4, 4])\n",
"y = np.array([9, 4, 0, 4, 0, 2, 1])\n",
"a = np.lexsort([x])\n",
"b = np.lexsort([y])\n",
"print(a)\n",
"# [0 2 4 3 5 6 1]\n",
"print(x[a])\n",
"# [1 1 3 4 4 4 5]\n",
"\n",
"print(b)\n",
"# [2 4 6 5 1 3 0]\n",
"print(y[b])\n",
"# [0 0 1 2 4 4 9]\n",
"\n",
"z = np.lexsort([y, x])\n",
"print(z)\n",
"# [2 0 4 6 5 3 1]\n",
"print(x[z])\n",
"# [1 1 3 4 4 4 5]\n",
"\n",
"z = np.lexsort([x, y])\n",
"print(z)\n",
"# [2 4 6 5 3 1 0]\n",
"print(y[z])\n",
"# [0 0 1 2 4 4 9]\n",
"```\n",
"\n",
"- `numpy.partition(a, kth, axis=-1, kind='introselect', order=None)` Return a partitioned copy of an array.\n",
"\n",
"Creates a copy of the array with its elements rearranged in such a way that the value of the element in k-th position is in the position it would be in a sorted array. All elements smaller than the k-th element are moved before this element and all equal or greater are moved behind it. The ordering of the elements in the two partitions is undefined.\n",
"\n",
"\n",
"【例】以索引是 kth 的元素为基准,将元素分成两部分,即大于该元素的放在其后面,小于该元素的放在其前面,这里有点类似于快排。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"x = np.random.randint(1, 30, [8, 3])\n",
"print(x)\n",
"# [[ 9 25 4]\n",
"# [ 8 24 16]\n",
"# [17 11 21]\n",
"# [ 3 22 3]\n",
"# [ 3 15 3]\n",
"# [18 17 25]\n",
"# [16 5 12]\n",
"# [29 27 17]]\n",
"\n",
"y = np.sort(x, axis=0)\n",
"print(y)\n",
"# [[ 3 5 3]\n",
"# [ 3 11 3]\n",
"# [ 8 15 4]\n",
"# [ 9 17 12]\n",
"# [16 22 16]\n",
"# [17 24 17]\n",
"# [18 25 21]\n",
"# [29 27 25]]\n",
"\n",
"z = np.partition(x, kth=2, axis=0)\n",
"print(z)\n",
"# [[ 3 5 3]\n",
"# [ 3 11 3]\n",
"# [ 8 15 4]\n",
"# [ 9 22 21]\n",
"# [17 24 16]\n",
"# [18 17 25]\n",
"# [16 25 12]\n",
"# [29 27 17]]\n",
"```\n",
"【例】选取每一列第三小的数\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"x = np.random.randint(1, 30, [8, 3])\n",
"print(x)\n",
"# [[ 9 25 4]\n",
"# [ 8 24 16]\n",
"# [17 11 21]\n",
"# [ 3 22 3]\n",
"# [ 3 15 3]\n",
"# [18 17 25]\n",
"# [16 5 12]\n",
"# [29 27 17]]\n",
"z = np.partition(x, kth=2, axis=0)\n",
"print(z[2])\n",
"# [ 8 15 4]\n",
"```\n",
"\n",
"【例】选取每一列第三大的数据\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"x = np.random.randint(1, 30, [8, 3])\n",
"print(x)\n",
"# [[ 9 25 4]\n",
"# [ 8 24 16]\n",
"# [17 11 21]\n",
"# [ 3 22 3]\n",
"# [ 3 15 3]\n",
"# [18 17 25]\n",
"# [16 5 12]\n",
"# [29 27 17]]\n",
"z = np.partition(x, kth=-3, axis=0)\n",
"print(z[-3])\n",
"# [17 24 17]\n",
"```\n",
"\n",
"\n",
"- `numpy.argpartition(a, kth, axis=-1, kind='introselect', order=None)`\n",
"\n",
"Perform an indirect partition along the given axis using the algorithm specified by the `kind` keyword. It returns an array of indices of the same shape as `a` that index data along the given axis in partitioned order.\n",
"\n",
"【例】\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"x = np.random.randint(1, 30, [8, 3])\n",
"print(x)\n",
"# [[ 9 25 4]\n",
"# [ 8 24 16]\n",
"# [17 11 21]\n",
"# [ 3 22 3]\n",
"# [ 3 15 3]\n",
"# [18 17 25]\n",
"# [16 5 12]\n",
"# [29 27 17]]\n",
"\n",
"y = np.argsort(x, axis=0)\n",
"print(y)\n",
"# [[3 6 3]\n",
"# [4 2 4]\n",
"# [1 4 0]\n",
"# [0 5 6]\n",
"# [6 3 1]\n",
"# [2 1 7]\n",
"# [5 0 2]\n",
"# [7 7 5]]\n",
"\n",
"z = np.argpartition(x, kth=2, axis=0)\n",
"print(z)\n",
"# [[3 6 3]\n",
"# [4 2 4]\n",
"# [1 4 0]\n",
"# [0 3 2]\n",
"# [2 1 1]\n",
"# [5 5 5]\n",
"# [6 0 6]\n",
"# [7 7 7]]\n",
"```\n",
"\n",
"【例】选取每一列第三小的数的索引\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"x = np.random.randint(1, 30, [8, 3])\n",
"print(x)\n",
"# [[ 9 25 4]\n",
"# [ 8 24 16]\n",
"# [17 11 21]\n",
"# [ 3 22 3]\n",
"# [ 3 15 3]\n",
"# [18 17 25]\n",
"# [16 5 12]\n",
"# [29 27 17]]\n",
"\n",
"z = np.argpartition(x, kth=2, axis=0)\n",
"print(z[2])\n",
"# [1 4 0]\n",
"```\n",
"\n",
"【例】选取每一列第三大的数的索引\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"x = np.random.randint(1, 30, [8, 3])\n",
"print(x)\n",
"# [[ 9 25 4]\n",
"# [ 8 24 16]\n",
"# [17 11 21]\n",
"# [ 3 22 3]\n",
"# [ 3 15 3]\n",
"# [18 17 25]\n",
"# [16 5 12]\n",
"# [29 27 17]]\n",
"\n",
"z = np.argpartition(x, kth=-3, axis=0)\n",
"print(z[-3])\n",
"# [2 1 7]\n",
"```\n",
"\n",
"\n",
"---\n",
"## 搜索\n",
"\n",
"- `numpy.argmax(a[, axis=None, out=None])`Returns the indices of the maximum values along an axis.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(20200612)\n",
"x = np.random.rand(5, 5) * 10\n",
"x = np.around(x, 2)\n",
"print(x)\n",
"# [[2.32 7.54 9.78 1.73 6.22]\n",
"# [6.93 5.17 9.28 9.76 8.25]\n",
"# [0.01 4.23 0.19 1.73 9.27]\n",
"# [7.99 4.97 0.88 7.32 4.29]\n",
"# [9.05 0.07 8.95 7.9 6.99]]\n",
"\n",
"y = np.argmax(x)\n",
"print(y) # 2\n",
"\n",
"y = np.argmax(x, axis=0)\n",
"print(y)\n",
"# [4 0 0 1 2]\n",
"\n",
"y = np.argmax(x, axis=1)\n",
"print(y)\n",
"# [2 3 4 0 0]\n",
"```\n",
"\n",
"- `numpy.argmin(a[, axis=None, out=None])`Returns the indices of the minimum values along an axis.\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.random.seed(20200612)\n",
"x = np.random.rand(5, 5) * 10\n",
"x = np.around(x, 2)\n",
"print(x)\n",
"# [[2.32 7.54 9.78 1.73 6.22]\n",
"# [6.93 5.17 9.28 9.76 8.25]\n",
"# [0.01 4.23 0.19 1.73 9.27]\n",
"# [7.99 4.97 0.88 7.32 4.29]\n",
"# [9.05 0.07 8.95 7.9 6.99]]\n",
"\n",
"y = np.argmin(x)\n",
"print(y) # 10\n",
"\n",
"y = np.argmin(x, axis=0)\n",
"print(y)\n",
"# [2 4 2 0 3]\n",
"\n",
"y = np.argmin(x, axis=1)\n",
"print(y)\n",
"# [3 1 0 2 1]\n",
"```\n",
"\n",
"\n",
"- `numppy.nonzero(a)` Return the indices of the elements that are non-zero.\n",
"\n",
",其值为非零元素的下标在对应轴上的值。\n",
"\n",
"1. 只有`a`中非零元素才会有索引值,那些零值元素没有索引值。\n",
"2. 返回一个长度为`a.ndim`的元组tuple元组的每个元素都是一个整数数组array。\n",
"3. 每一个array均是从一个维度上来描述其索引值。比如如果`a`是一个二维数组则tuple包含两个array第一个array从行维度来描述索引值第二个array从列维度来描述索引值。\n",
"4. 该 `np.transpose(np.nonzero(x))` 函数能够描述出每一个非零元素在不同维度的索引值。\n",
"5. 通过`a[nonzero(a)]`得到所有`a`中的非零值。\n",
"\n",
"【例】一维数组\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([0, 2, 3])\n",
"print(x) # [0 2 3]\n",
"print(x.shape) # (3,)\n",
"print(x.ndim) # 1\n",
"\n",
"y = np.nonzero(x)\n",
"print(y) # (array([1, 2], dtype=int64),)\n",
"print(np.array(y)) # [[1 2]]\n",
"print(np.array(y).shape) # (1, 2)\n",
"print(np.array(y).ndim) # 2\n",
"print(np.transpose(y))\n",
"# [[1]\n",
"# [2]]\n",
"print(x[np.nonzero(x)])\n",
"#[2, 3]\n",
"```\n",
"\n",
"【例】二维数组\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]])\n",
"print(x)\n",
"# [[3 0 0]\n",
"# [0 4 0]\n",
"# [5 6 0]]\n",
"print(x.shape) # (3, 3)\n",
"print(x.ndim) # 2\n",
"\n",
"y = np.nonzero(x)\n",
"print(y)\n",
"# (array([0, 1, 2, 2], dtype=int64), array([0, 1, 0, 1], dtype=int64))\n",
"print(np.array(y))\n",
"# [[0 1 2 2]\n",
"# [0 1 0 1]]\n",
"print(np.array(y).shape) # (2, 4)\n",
"print(np.array(y).ndim) # 2\n",
"\n",
"y = x[np.nonzero(x)]\n",
"print(y) # [3 4 5 6]\n",
"\n",
"y = np.transpose(np.nonzero(x))\n",
"print(y)\n",
"# [[0 0]\n",
"# [1 1]\n",
"# [2 0]\n",
"# [2 1]]\n",
"```\n",
"【例】三维数组\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[[0, 1], [1, 0]], [[0, 1], [1, 0]], [[0, 0], [1, 0]]])\n",
"print(x)\n",
"# [[[0 1]\n",
"# [1 0]]\n",
"#\n",
"# [[0 1]\n",
"# [1 0]]\n",
"#\n",
"# [[0 0]\n",
"# [1 0]]]\n",
"print(np.shape(x)) # (3, 2, 2)\n",
"print(x.ndim) # 3\n",
"\n",
"y = np.nonzero(x)\n",
"print(np.array(y))\n",
"# [[0 0 1 1 2]\n",
"# [0 1 0 1 1]\n",
"# [1 0 1 0 0]]\n",
"print(np.array(y).shape) # (3, 5)\n",
"print(np.array(y).ndim) # 2\n",
"print(y)\n",
"# (array([0, 0, 1, 1, 2], dtype=int64), array([0, 1, 0, 1, 1], dtype=int64), array([1, 0, 1, 0, 0], dtype=int64))\n",
"print(x[np.nonzero(x)])\n",
"#[1 1 1 1 1]\n",
"```\n",
"\n",
"【例】`nonzero()`将布尔数组转换成整数数组进行操作。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n",
"print(x)\n",
"# [[1 2 3]\n",
"# [4 5 6]\n",
"# [7 8 9]]\n",
"\n",
"y = x > 3\n",
"print(y)\n",
"# [[False False False]\n",
"# [ True True True]\n",
"# [ True True True]]\n",
"\n",
"y = np.nonzero(x > 3)\n",
"print(y)\n",
"# (array([1, 1, 1, 2, 2, 2], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))\n",
"\n",
"y = x[np.nonzero(x > 3)]\n",
"print(y)\n",
"# [4 5 6 7 8 9]\n",
"\n",
"y = x[x > 3]\n",
"print(y)\n",
"# [4 5 6 7 8 9]\n",
"```\n",
"\n",
"- `numpy.where(condition, [x=None, y=None])` Return elements chosen from `x` or `y` depending on `condition`.\n",
"\n",
"【例】满足条件`condition`,输出`x`,不满足输出`y`。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.arange(10)\n",
"print(x)\n",
"# [0 1 2 3 4 5 6 7 8 9]\n",
"\n",
"y = np.where(x < 5, x, 10 * x)\n",
"print(y)\n",
"# [ 0 1 2 3 4 50 60 70 80 90]\n",
"\n",
"x = np.array([[0, 1, 2],\n",
" [0, 2, 4],\n",
" [0, 3, 6]])\n",
"y = np.where(x < 4, x, -1)\n",
"print(y)\n",
"# [[ 0 1 2]\n",
"# [ 0 2 -1]\n",
"# [ 0 3 -1]]\n",
"```\n",
"\n",
"【例】只有`condition`,没有`x`和`y`,则输出满足条件 (即非0) 元素的坐标 (等价于`numpy.nonzero`)。这里的坐标以tuple的形式给出通常原数组有多少维输出的tuple中就包含几个数组分别对应符合条件元素的各维坐标。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
"y = np.where(x > 5)\n",
"print(y)\n",
"# (array([5, 6, 7], dtype=int64),)\n",
"print(x[y])\n",
"# [6 7 8]\n",
"\n",
"y = np.nonzero(x > 5)\n",
"print(y)\n",
"# (array([5, 6, 7], dtype=int64),)\n",
"print(x[y])\n",
"# [6 7 8]\n",
"\n",
"x = np.array([[11, 12, 13, 14, 15],\n",
" [16, 17, 18, 19, 20],\n",
" [21, 22, 23, 24, 25],\n",
" [26, 27, 28, 29, 30],\n",
" [31, 32, 33, 34, 35]])\n",
"y = np.where(x > 25)\n",
"print(y)\n",
"# (array([3, 3, 3, 3, 3, 4, 4, 4, 4, 4], dtype=int64), array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))\n",
"\n",
"print(x[y])\n",
"# [26 27 28 29 30 31 32 33 34 35]\n",
"\n",
"y = np.nonzero(x > 25)\n",
"print(y)\n",
"# (array([3, 3, 3, 3, 3, 4, 4, 4, 4, 4], dtype=int64), array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))\n",
"print(x[y])\n",
"# [26 27 28 29 30 31 32 33 34 35]\n",
"```\n",
"\n",
"\n",
"\n",
"\n",
"- `numpy.searchsorted(a, v[, side='left', sorter=None])` Find indices where elements should be inserted to maintain order.\n",
" - a一维输入数组。当`sorter`参数为`None`的时候,`a`必须为升序数组;否则,`sorter`不能为空,存放`a`中元素的`index`,用于反映`a`数组的升序排列方式。\n",
" - v插入`a`数组的值,可以为单个元素,`list`或者`ndarray`。\n",
" - side查询方向当为`left`时,将返回第一个符合条件的元素下标;当为`right`时,将返回最后一个符合条件的元素下标。\n",
" - sorter一维数组存放`a`数组元素的 indexindex 对应元素为升序。\n",
"\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([0, 1, 5, 9, 11, 18, 26, 33])\n",
"y = np.searchsorted(x, 15)\n",
"print(y) # 5\n",
"\n",
"y = np.searchsorted(x, 15, side='right')\n",
"print(y) # 5\n",
"\n",
"y = np.searchsorted(x, -1)\n",
"print(y) # 0\n",
"\n",
"y = np.searchsorted(x, -1, side='right')\n",
"print(y) # 0\n",
"\n",
"y = np.searchsorted(x, 35)\n",
"print(y) # 8\n",
"\n",
"y = np.searchsorted(x, 35, side='right')\n",
"print(y) # 8\n",
"\n",
"y = np.searchsorted(x, 11)\n",
"print(y) # 4\n",
"\n",
"y = np.searchsorted(x, 11, side='right')\n",
"print(y) # 5\n",
"\n",
"y = np.searchsorted(x, 0)\n",
"print(y) # 0\n",
"\n",
"y = np.searchsorted(x, 0, side='right')\n",
"print(y) # 1\n",
"\n",
"y = np.searchsorted(x, 33)\n",
"print(y) # 7\n",
"\n",
"y = np.searchsorted(x, 33, side='right')\n",
"print(y) # 8\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([0, 1, 5, 9, 11, 18, 26, 33])\n",
"y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35])\n",
"print(y) # [0 0 4 5 7 8]\n",
"\n",
"y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], side='right')\n",
"print(y) # [0 1 5 5 8 8]\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.array([0, 1, 5, 9, 11, 18, 26, 33])\n",
"np.random.shuffle(x)\n",
"print(x) # [33 1 9 18 11 26 0 5]\n",
"\n",
"x_sort = np.argsort(x)\n",
"print(x_sort) # [6 1 7 2 4 3 5 0]\n",
"\n",
"y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], sorter=x_sort)\n",
"print(y) # [0 0 4 5 7 8]\n",
"\n",
"y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], side='right', sorter=x_sort)\n",
"print(y) # [0 1 5 5 8 8]\n",
"```\n",
"\n",
"\n",
"---\n",
"## 计数\n",
"\n",
"- `numpy.count_nonzero(a, axis=None)` Counts the number of non-zero values in the array a.\n",
"\n",
"【例】返回数组中的非0元素个数。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.count_nonzero(np.eye(4))\n",
"print(x) # 4\n",
"\n",
"x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]])\n",
"print(x) # 5\n",
"\n",
"x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis=0)\n",
"print(x) # [1 1 1 1 1]\n",
"\n",
"x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis=1)\n",
"print(x) # [2 3]\n",
"```\n",
"\n",
"---\n",
"**参考文献**\n",
"\n",
"- https://blog.csdn.net/u013698770/article/details/54632047\n",
"- https://www.cnblogs.com/massquantity/p/8908859.html\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,246 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 集合操作\n",
"\n",
"## 构造集合\n",
"\n",
"- `numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)` Find the unique elements of an array.\n",
" - `return_index=True` 表示返回新列表元素在旧列表中的位置。\n",
" - `return_inverse=True`表示返回旧列表元素在新列表中的位置。\n",
" - `return_counts=True`表示返回新列表元素在旧列表中出现的次数。\n",
" \n",
" \n",
"【例】找出数组中的唯一值并返回已排序的结果。\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.unique([1, 1, 3, 2, 3, 3])\n",
"print(x) # [1 2 3]\n",
"\n",
"x = sorted(set([1, 1, 3, 2, 3, 3]))\n",
"print(x) # [1, 2, 3]\n",
"\n",
"x = np.array([[1, 1], [2, 3]])\n",
"u = np.unique(x)\n",
"print(u) # [1 2 3]\n",
"\n",
"x = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])\n",
"y = np.unique(x, axis=0)\n",
"print(y)\n",
"# [[1 0 0]\n",
"# [2 3 4]]\n",
"\n",
"x = np.array(['a', 'b', 'b', 'c', 'a'])\n",
"u, index = np.unique(x, return_index=True)\n",
"print(u) # ['a' 'b' 'c']\n",
"print(index) # [0 1 3]\n",
"print(x[index]) # ['a' 'b' 'c']\n",
"\n",
"x = np.array([1, 2, 6, 4, 2, 3, 2])\n",
"u, index = np.unique(x, return_inverse=True)\n",
"print(u) # [1 2 3 4 6]\n",
"print(index) # [0 1 4 3 1 2 1]\n",
"print(u[index]) # [1 2 6 4 2 3 2]\n",
"\n",
"u, count = np.unique(x, return_counts=True)\n",
"print(u) # [1 2 3 4 6]\n",
"print(count) # [1 3 1 1 1]\n",
"```\n",
"\n",
"## 布尔运算\n",
"\n",
"- `numpy.in1d(ar1, ar2, assume_unique=False, invert=False)` Test whether each element of a 1-D array is also present in a second array.\n",
"\n",
"Returns a boolean array the same length as `ar1` that is True where an element of `ar1` is in `ar2` and False otherwise.\n",
"\n",
"【例】前面的数组是否包含于后面的数组,返回布尔值。返回的值是针对第一个参数的数组的,所以维数和第一个参数一致,布尔值与数组的元素位置也一一对应。\n",
"```python\n",
"import numpy as np\n",
"\n",
"test = np.array([0, 1, 2, 5, 0])\n",
"states = [0, 2]\n",
"mask = np.in1d(test, states)\n",
"print(mask) # [ True False True False True]\n",
"print(test[mask]) # [0 2 0]\n",
"\n",
"mask = np.in1d(test, states, invert=True)\n",
"print(mask) # [False True False True False]\n",
"print(test[mask]) # [1 5]\n",
"```\n",
"\n",
"\n",
"### 求两个集合的交集:\n",
"\n",
"- `numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False)` Find the intersection of two arrays.\n",
"\n",
"Return the sorted, unique values that are in both of the input arrays.\n",
"\n",
"【例】求两个数组的唯一化+求交集+排序函数。\n",
"```python\n",
"import numpy as np\n",
"from functools import reduce\n",
"\n",
"x = np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])\n",
"print(x) # [1 3]\n",
"\n",
"x = np.array([1, 1, 2, 3, 4])\n",
"y = np.array([2, 1, 4, 6])\n",
"xy, x_ind, y_ind = np.intersect1d(x, y, return_indices=True)\n",
"print(x_ind) # [0 2 4]\n",
"print(y_ind) # [1 0 2]\n",
"print(xy) # [1 2 4]\n",
"print(x[x_ind]) # [1 2 4]\n",
"print(y[y_ind]) # [1 2 4]\n",
"\n",
"x = reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))\n",
"print(x) # [3]\n",
"```\n",
"\n",
"### 求两个集合的并集:\n",
"\n",
"- `numpy.union1d(ar1, ar2)` Find the union of two arrays.\n",
"\n",
"Return the unique, sorted array of values that are in either of the two input arrays.\n",
"\n",
"【例】计算两个集合的并集,唯一化并排序。\n",
"```python\n",
"import numpy as np\n",
"from functools import reduce\n",
"\n",
"x = np.union1d([-1, 0, 1], [-2, 0, 2])\n",
"print(x) # [-2 -1 0 1 2]\n",
"x = reduce(np.union1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))\n",
"print(x) # [1 2 3 4 6]\n",
"'''\n",
"functools.reduce(function, iterable[, initializer])\n",
"将两个参数的 function 从左至右积累地应用到 iterable 的条目,以便将该可迭代对象缩减为单一的值。 例如reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 是计算 ((((1+2)+3)+4)+5) 的值。 左边的参数 x 是积累值而右边的参数 y 则是来自 iterable 的更新值。 如果存在可选项 initializer它会被放在参与计算的可迭代对象的条目之前并在可迭代对象为空时作为默认值。 如果没有给出 initializer 并且 iterable 仅包含一个条目,则将返回第一项。\n",
"\n",
"大致相当于:\n",
"def reduce(function, iterable, initializer=None):\n",
" it = iter(iterable)\n",
" if initializer is None:\n",
" value = next(it)\n",
" else:\n",
" value = initializer\n",
" for element in it:\n",
" value = function(value, element)\n",
" return value\n",
"'''\n",
"```\n",
"\n",
"### 求两个集合的差集:\n",
"\n",
"- `numpy.setdiff1d(ar1, ar2, assume_unique=False)` Find the set difference of two arrays.\n",
"\n",
"\n",
"Return the unique values in `ar1` that are not in `ar2`.\n",
"\n",
"【例】集合的差,即元素存在于第一个函数不存在于第二个函数中。\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 2, 4, 1])\n",
"b = np.array([3, 4, 5, 6])\n",
"x = np.setdiff1d(a, b)\n",
"print(x) # [1 2]\n",
"```\n",
"\n",
"### 求两个集合的异或:\n",
"\n",
"- `setxor1d(ar1, ar2, assume_unique=False)` Find the set exclusive-or of two arrays.\n",
"\n",
"【例】集合的对称差,即两个集合的交集的补集。简言之,就是两个数组中各自独自拥有的元素的集合。\n",
"\n",
"```python\n",
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 2, 4, 1])\n",
"b = np.array([3, 4, 5, 6])\n",
"x = np.setxor1d(a, b)\n",
"print(x) # [1 2 5 6]\n",
"```\n",
"\n",
"\n",
"\n",
"---\n",
"**参考文献**\n",
"- https://www.jianshu.com/p/3bfe21aa1adb\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,512 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 排序搜索计数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**如何通过第n列对一个数组进行排序**\n",
"\n",
"【知识点:排序】\n",
"\n",
"- (提示: argsort)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:34.985841Z",
"start_time": "2020-09-15T07:06:34.567440Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 6 0]\n",
" [7 0 3]\n",
" [0 6 0]]\n"
]
}
],
"source": [
"Z = np.random.randint(0,10,(3,3))\n",
"print (Z)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:35.022771Z",
"start_time": "2020-09-15T07:06:35.000801Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 6 0]\n",
" [0 6 0]\n",
" [7 0 3]]\n"
]
}
],
"source": [
"print (Z[Z[:,2].argsort()])"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:43:15.537614Z",
"start_time": "2020-09-06T02:43:15.532628Z"
}
},
"source": [
"**从`arr`中提取所有奇数。**\n",
"\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何从一维数组中提取满足指定条件的元素?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:35.384825Z",
"start_time": "2020-09-15T07:06:35.376847Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1 3 5 7 9]\n",
"[1 3 5 7 9]\n"
]
}
],
"source": [
"#【答案】\n",
"import numpy as np\n",
"\n",
"arr = np.arange(10)\n",
"\n",
"# 方法1\n",
"index = np.where(arr % 2 == 1)\n",
"print(arr[index])\n",
"# [1 3 5 7 9]\n",
"\n",
"# 方法2\n",
"x = arr[arr % 2 == 1]\n",
"print(x)\n",
"# [1 3 5 7 9]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**将`arr`中的偶数元素替换为0。**\n",
"\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何用numpy数组中的另一个值替换满足条件的元素项"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:35.907995Z",
"start_time": "2020-09-15T07:06:35.903011Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 1 0 3 0 5 0 7 0 9]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"arr = np.arange(10)\n",
"index = np.where(arr % 2 == 0)\n",
"arr[index] = 0\n",
"print(arr)\n",
"# [0 1 0 3 0 5 0 7 0 9]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**将 `arr` 中的所有偶数元素替换为0而不改变arr。**\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何在不影响原始数组的情况下替换满足条件的元素项?"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:36.689514Z",
"start_time": "2020-09-15T07:06:36.608498Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 1 0 3 0 5 0 7 0 9]\n",
"[0 1 2 3 4 5 6 7 8 9]\n",
"[0 1 0 3 0 5 0 7 0 9]\n",
"[0 1 2 3 4 5 6 7 8 9]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"arr = np.arange(10)\n",
"\n",
"# 方法1\n",
"x = np.where(arr % 2 == 0, 0, arr)\n",
"print(x)\n",
"# [0 1 0 3 0 5 0 7 0 9]\n",
"print(arr)\n",
"# [0 1 2 3 4 5 6 7 8 9]\n",
"\n",
"# 方法2\n",
"x = np.copy(arr)\n",
"x[x % 2 == 0] = 0\n",
"print(x)\n",
"# [0 1 0 3 0 5 0 7 0 9]\n",
"print(arr)\n",
"# [0 1 2 3 4 5 6 7 8 9]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:10:15.790588Z",
"start_time": "2020-09-06T03:10:15.785591Z"
}
},
"source": [
"**获取给定数组a中前5个最大值的位置。**\n",
"\n",
"- `a = np.random.uniform(1, 50, 20)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何从numpy数组中获取最大的n个值的位置"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:37.223217Z",
"start_time": "2020-09-15T07:06:37.205278Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[27.62684215 14.64009987 21.80136195 42.39403048 1.23122395 6.95688692\n",
" 33.86670515 41.466785 7.69862289 29.17957314 44.67477576 11.25090398\n",
" 10.08108276 6.31046763 11.76517714 48.95256545 40.77247431 9.42510962\n",
" 40.99501269 14.42961361]\n",
"[ 4 13 5 8 17 12 11 14 19 1 2 0 9 6 16 18 7 3 10 15]\n",
"[18 7 3 10 15]\n",
"(array([ 3, 7, 10, 15, 18], dtype=int64),)\n",
"[18 7 3 10 15]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"np.random.seed(100)\n",
"a = np.random.uniform(1, 50, 20)\n",
"print(a)\n",
"# [27.62684215 14.64009987 21.80136195 42.39403048 1.23122395 6.95688692\n",
"# 33.86670515 41.466785 7.69862289 29.17957314 44.67477576 11.25090398\n",
"# 10.08108276 6.31046763 11.76517714 48.95256545 40.77247431 9.42510962\n",
"# 40.99501269 14.42961361]\n",
"\n",
"# 方法1\n",
"b = np.argsort(a)\n",
"print(b)\n",
"print(b[-5:])\n",
"# [18 7 3 10 15]\n",
"\n",
"# 方法2\n",
"b = np.sort(a)\n",
"b = np.where(a >= b[-5])\n",
"print(b)\n",
"# (array([ 3, 7, 10, 15, 18], dtype=int64),)\n",
"\n",
"# 方法3\n",
"b = np.argpartition(a, kth=-5)\n",
"print(b[-5:])\n",
"# [18 7 3 10 15]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:16:45.278429Z",
"start_time": "2020-09-06T03:16:45.274474Z"
}
},
"source": [
"**删除一维numpy数组中所有NaN值。**\n",
"\n",
"- `a = np.array([1, 2, 3, np.nan, 5, 6, 7, np.nan])`\n",
"\n",
"【知识点:逻辑函数、搜索】\n",
"- 如何删除numpy数组中的缺失值"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:37.705909Z",
"start_time": "2020-09-15T07:06:37.699887Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1. 2. 3. 5. 6. 7.]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, np.nan, 5, 6, 7, np.nan])\n",
"b = np.isnan(a)\n",
"c = np.where(np.logical_not(b))\n",
"print(a[c])\n",
"# [1. 2. 3. 5. 6. 7.]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 集合操作"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:49:53.817130Z",
"start_time": "2020-09-06T02:49:53.812188Z"
}
},
"source": [
"**获取数组a和数组b之间的公共项。**\n",
"\n",
"- `a = np.array([1, 2, 3, 2, 3, 4, 3, 4, 5, 6])`\n",
"- `b = np.array([7, 2, 10, 2, 7, 4, 9, 4, 9, 8])`\n",
"\n",
"【知识点:集合操作】\n",
"- 如何获取两个numpy数组之间的公共项"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:38.496578Z",
"start_time": "2020-09-15T07:06:38.489570Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2 4]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 2, 3, 4, 3, 4, 5, 6])\n",
"b = np.array([7, 2, 10, 2, 7, 4, 9, 4, 9, 8])\n",
"x = np.intersect1d(a, b)\n",
"print(x) # [2 4]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T02:50:45.262179Z",
"start_time": "2020-09-06T02:50:45.257192Z"
}
},
"source": [
"**从数组a中删除数组b中的所有项。**\n",
"- `a = np.array([1, 2, 3, 4, 5])`\n",
"- `b = np.array([5, 6, 7, 8, 9])`\n",
"\n",
"【知识点:集合操作】\n",
"- 如何从一个数组中删除存在于另一个数组中的项?"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-15T07:06:39.018110Z",
"start_time": "2020-09-15T07:06:38.996083Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1 2 3 4]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 4, 5])\n",
"b = np.array([5, 6, 7, 8, 9])\n",
"x = np.setdiff1d(a, b)\n",
"print(x) # [1 2 3 4]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.2px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,184 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 排序搜索计数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **如何通过第n列对一个数组进行排序**\n",
"- `Z = np.random.randint(0,10,(3,3))`\n",
"\n",
"【知识点:排序】\n",
"\n",
"- (提示: argsort)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **从`arr`中提取所有奇数。**\n",
"\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何从一维数组中提取满足指定条件的元素?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **将`arr`中的偶数元素替换为0。**\n",
"\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何用numpy数组中的另一个值替换满足条件的元素项"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ** 将 `arr` 中的所有偶数元素替换为0而不改变arr。**\n",
"- `arr = np.arange(10)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何在不影响原始数组的情况下替换满足条件的元素项?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **获取给定数组a中前5个最大值的位置。**\n",
"\n",
"- `a = np.random.uniform(1, 50, 20)`\n",
"\n",
"【知识点:搜索】\n",
"- 如何从numpy数组中获取最大的n个值的位置"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **删除一维numpy数组中所有NaN值。**\n",
"\n",
"- `a = np.array([1, 2, 3, np.nan, 5, 6, 7, np.nan])`\n",
"\n",
"【知识点:逻辑函数、搜索】\n",
"- 如何删除numpy数组中的缺失值"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 集合操作"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **获取数组a和数组b之间的公共项。**\n",
"\n",
"- `a = np.array([1, 2, 3, 2, 3, 4, 3, 4, 5, 6])`\n",
"- `b = np.array([7, 2, 10, 2, 7, 4, 9, 4, 9, 8])`\n",
"\n",
"【知识点:集合操作】\n",
"- 如何获取两个numpy数组之间的公共项"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **从数组a中删除数组b中的所有项。**\n",
"- `a = np.array([1, 2, 3, 4, 5])`\n",
"- `b = np.array([5, 6, 7, 8, 9])`\n",
"\n",
"【知识点:集合操作】\n",
"- 如何从一个数组中删除存在于另一个数组中的项?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,230 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:20:09.947636Z",
"start_time": "2020-09-06T03:20:09.941689Z"
}
},
"source": [
"**计算两个数组a和数组b之间的欧氏距离。**\n",
"\n",
"- `a = np.array([1, 2, 3, 4, 5])`\n",
"- `b = np.array([4, 5, 6, 7, 8])`\n",
"\n",
"【知识点:数学函数、线性代数】\n",
"- 如何计算两个数组之间的欧式距离?"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:20:29.252448Z",
"start_time": "2020-09-06T03:20:29.247462Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6.708203932499369\n",
"6.708203932499369\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.array([1, 2, 3, 4, 5])\n",
"b = np.array([4, 5, 6, 7, 8])\n",
"\n",
"# 方法1\n",
"d = np.sqrt(np.sum((a - b) ** 2))\n",
"print(d) # 6.708203932499369\n",
"\n",
"# 方法2\n",
"d = np.linalg.norm(a - b)\n",
"print(d) # 6.708203932499369"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**计算矩阵的行列式和矩阵的逆**"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:14:17.578966Z",
"start_time": "2020-09-14T09:14:17.574254Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[5, 0, 0, 0, 0],\n",
" [0, 5, 0, 0, 0],\n",
" [0, 0, 5, 0, 0],\n",
" [0, 0, 0, 5, 0],\n",
" [0, 0, 0, 0, 5]])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.diag([5,5,5,5,5])"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:14:06.174005Z",
"start_time": "2020-09-14T09:14:06.171012Z"
}
},
"outputs": [],
"source": [
" result=np.diag([5,5,5,5,5])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:14:07.806217Z",
"start_time": "2020-09-14T09:14:07.800758Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"3124.999999999999"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.linalg.det(result)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-14T09:16:30.223746Z",
"start_time": "2020-09-14T09:16:30.217896Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.2, 0. , 0. , 0. , 0. ],\n",
" [0. , 0.2, 0. , 0. , 0. ],\n",
" [0. , 0. , 0.2, 0. , 0. ],\n",
" [0. , 0. , 0. , 0.2, 0. ],\n",
" [0. , 0. , 0. , 0. , 0.2]])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.linalg.inv(result)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,229 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:05:42.613206Z",
"start_time": "2020-09-06T03:05:42.609217Z"
}
},
"source": [
"**只打印或显示numpy数组rand_arr的小数点后3位。**\n",
"\n",
"- `rand_arr = np.random.random([5, 3])`\n",
"\n",
"【知识点:输入和输出】\n",
"- 如何在numpy数组中只打印小数点后三位"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:06:03.840763Z",
"start_time": "2020-09-06T03:06:03.834778Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0.25106063 0.32735642 0.17623774]\n",
" [0.85566173 0.11420437 0.53735783]\n",
" [0.82253612 0.07625331 0.9358199 ]\n",
" [0.97268875 0.91794448 0.61845404]\n",
" [0.58615827 0.28096349 0.88048956]]\n",
"[[0.251 0.327 0.176]\n",
" [0.856 0.114 0.537]\n",
" [0.823 0.076 0.936]\n",
" [0.973 0.918 0.618]\n",
" [0.586 0.281 0.88 ]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"rand_arr = np.random.random([5, 3])\n",
"print(rand_arr)\n",
"# [[0.33033427 0.05538836 0.05947305]\n",
"# [0.36199439 0.48844555 0.26309599]\n",
"# [0.05361816 0.71539075 0.60645637]\n",
"# [0.95000384 0.31424729 0.41032467]\n",
"# [0.36082793 0.50101268 0.6306832 ]]\n",
"\n",
"np.set_printoptions(precision=3)\n",
"print(rand_arr)\n",
"# [[0.33 0.055 0.059]\n",
"# [0.362 0.488 0.263]\n",
"# [0.054 0.715 0.606]\n",
"# [0.95 0.314 0.41 ]\n",
"# [0.361 0.501 0.631]]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:06:22.855956Z",
"start_time": "2020-09-06T03:06:22.850970Z"
}
},
"source": [
"**将numpy数组a中打印的项数限制为最多6个元素。**\n",
"\n",
"【知识点:输入和输出】\n",
"- 如何限制numpy数组输出中打印的项目数"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:06:51.128200Z",
"start_time": "2020-09-06T03:06:51.123215Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]\n",
"[ 0 1 2 ... 12 13 14]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.arange(15)\n",
"print(a)\n",
"# [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]\n",
"np.set_printoptions(threshold=6)\n",
"print(a)\n",
"# [ 0 1 2 ... 12 13 14]"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:07:14.131621Z",
"start_time": "2020-09-06T03:07:14.126608Z"
}
},
"source": [
"**打印完整的numpy数组a而不中断。**\n",
"\n",
"【知识点:输入和输出】\n",
"- 如何打印完整的numpy数组而不中断"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:07:47.868079Z",
"start_time": "2020-09-06T03:07:47.863126Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0 1 2 ... 12 13 14]\n",
"[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"a = np.arange(15)\n",
"np.set_printoptions(threshold=6)\n",
"print(a)\n",
"# [ 0 1 2 ... 12 13 14]\n",
"np.set_printoptions(threshold=np.iinfo(np.int).max)\n",
"print(a)\n",
"# [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,372 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 输入和输出\n",
"\n",
"\n",
"\n",
"## numpy 二进制文件\n",
"\n",
"`save()`、`savez()`和`load()`函数以 numpy 专用的二进制类型npy、npz保存和读取数据这三个函数会自动处理ndim、dtype、shape等信息使用它们读写数组非常方便但是`save()`输出的文件很难与其它语言编写的程序兼容。\n",
"\n",
"npy格式以二进制的方式存储文件在二进制文件第一行以文本形式保存了数据的元信息ndimdtypeshape等可以用二进制工具查看内容。\n",
"\n",
"npz格式以压缩打包的方式存储文件可以用压缩软件解压。\n",
"\n",
"\n",
"- `numpy.save(file, arr, allow_pickle=True, fix_imports=True)` Save an array to a binary file in NumPy `.npy` format.\n",
"- `numpy.load(file, mmap_mode=None, allow_pickle=False, fix_imports=True, encoding='ASCII')` Load arrays or pickled objects from ``.npy``, ``.npz`` or pickled files.\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"outfile = r'.\\test.npy'\n",
"np.random.seed(20200619)\n",
"x = np.random.uniform(0, 1, [3, 5])\n",
"np.save(outfile, x)\n",
"y = np.load(outfile)\n",
"print(y)\n",
"# [[0.01123594 0.66790705 0.50212171 0.7230908 0.61668256]\n",
"# [0.00668332 0.1234096 0.96092409 0.67925305 0.38596837]\n",
"# [0.72342998 0.26258324 0.24318845 0.98795012 0.77370715]]\n",
"```\n",
"\n",
"- `numpy.savez(file, *args, **kwds)` Save several arrays into a single file in uncompressed `.npz` format.\n",
"\n",
"`savez()`第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为`arr_0, arr_1, …`。\n",
"\n",
"`savez()`输出的是一个压缩文件扩展名为npz其中每个文件都是一个`save()`保存的npy文件文件名对应于数组名。`load()`自动识别npz文件并且返回一个类似于字典的对象可以通过数组名作为关键字获取数组的内容。\n",
"\n",
"【例】将多个数组保存到一个文件,可以使用`numpy.savez()`函数。\n",
"```python\n",
"import numpy as np\n",
"\n",
"outfile = r'.\\test.npz'\n",
"x = np.linspace(0, np.pi, 5)\n",
"y = np.sin(x)\n",
"z = np.cos(x)\n",
"np.savez(outfile, x, y, z_d=z)\n",
"data = np.load(outfile)\n",
"np.set_printoptions(suppress=True)\n",
"print(data.files) \n",
"# ['z_d', 'arr_0', 'arr_1']\n",
"\n",
"print(data['arr_0'])\n",
"# [0. 0.78539816 1.57079633 2.35619449 3.14159265]\n",
"\n",
"print(data['arr_1'])\n",
"# [0. 0.70710678 1. 0.70710678 0. ]\n",
"\n",
"print(data['z_d'])\n",
"# [ 1. 0.70710678 0. -0.70710678 -1. ]\n",
"```\n",
"\n",
"用解压软件打开 test.npz 文件,会发现其中有三个文件:`arr_0.npy,arr_1.npy,z_d.npy`,其中分别保存着数组`x,y,z`的内容。\n",
"\n",
"\n",
"---\n",
"## 文本文件\n",
"`savetxt()``loadtxt()`和`genfromtxt()`函数用来存储和读取文本文件如TXTCSV等。`genfromtxt()`比`loadtxt()`更加强大,可对缺失数据进行处理。\n",
"\n",
"- `numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\\n', header='', footer='', comments='# ', encoding=None)` Save an array to a text file.\n",
" - fname文件路径\n",
" - X存入文件的数组。\n",
" - fmt写入文件中每个元素的字符串格式默认'%.18e'保留18位小数的浮点数形式。\n",
" - delimiter分割字符串默认以空格分隔。\n",
"\n",
"\n",
"- `numpy.loadtxt(fname, dtype=float, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)` Load data from a text file. \n",
" - fname文件路径。\n",
" - dtype数据类型默认为float。\n",
" - comments: 字符串或字符串组成的列表,默认为# 表示注释字符集开始的标志。\n",
" - skiprows跳过多少行一般跳过第一行表头。\n",
" - usecols元组元组内数据为列的数值索引 用来指定要读取数据的列第一列为0。\n",
" - unpack当加载多列数据时是否需要将数据列进行解耦赋值给不同的变量。\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"【例】写入和读出TXT文件。\n",
"```python\n",
"import numpy as np\n",
"\n",
"outfile = r'.\\test.txt'\n",
"x = np.arange(0, 10).reshape(2, -1)\n",
"np.savetxt(outfile, x)\n",
"y = np.loadtxt(outfile)\n",
"print(y)\n",
"# [[0. 1. 2. 3. 4.]\n",
"# [5. 6. 7. 8. 9.]]\n",
"```\n",
"\n",
"test.txt文件如下\n",
"\n",
"```python\n",
"0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00 4.000000000000000000e+00\n",
"5.000000000000000000e+00 6.000000000000000000e+00 7.000000000000000000e+00 8.000000000000000000e+00 9.000000000000000000e+00\n",
"```\n",
"\n",
"\n",
"【例】写入和读出CSV文件。\n",
"```python\n",
"import numpy as np\n",
"\n",
"outfile = r'.\\test.csv'\n",
"x = np.arange(0, 10, 0.5).reshape(4, -1)\n",
"np.savetxt(outfile, x, fmt='%.3f', delimiter=',')\n",
"y = np.loadtxt(outfile, delimiter=',')\n",
"print(y)\n",
"# [[0. 0.5 1. 1.5 2. ]\n",
"# [2.5 3. 3.5 4. 4.5]\n",
"# [5. 5.5 6. 6.5 7. ]\n",
"# [7.5 8. 8.5 9. 9.5]]\n",
"```\n",
"\n",
"test.csv文件如下\n",
"```python\n",
"0.000,0.500,1.000,1.500,2.000\n",
"2.500,3.000,3.500,4.000,4.500\n",
"5.000,5.500,6.000,6.500,7.000\n",
"7.500,8.000,8.500,9.000,9.500\n",
"```\n",
"\n",
"\n",
"\n",
"`genfromtxt()`是面向结构数组和缺失数据处理的。\n",
"\n",
"- `numpy.genfromtxt(fname, dtype=float, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=''.join(sorted(NameValidator.defaultdeletechars)), replace_space='_', autostrip=False, case_sensitive=True, defaultfmt=\"f%i\", unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')` Load data from a text file, with missing values handled as specified.\n",
" - names设置为True时程序将把第一行作为列名称。\n",
"\n",
"\n",
"data.csv文件如下\n",
"```python\n",
"id,value1,value2,value3\n",
"1,123,1.4,23\n",
"2,110,0.5,18\n",
"3,164,2.1,19\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"outfile = r'.\\data.csv'\n",
"x = np.loadtxt(outfile, delimiter=',', skiprows=1)\n",
"print(x)\n",
"# [[ 1. 123. 1.4 23. ]\n",
"# [ 2. 110. 0.5 18. ]\n",
"# [ 3. 164. 2.1 19. ]]\n",
"\n",
"x = np.loadtxt(outfile, delimiter=',', skiprows=1, usecols=(1, 2))\n",
"print(x)\n",
"# [[123. 1.4]\n",
"# [110. 0.5]\n",
"# [164. 2.1]]\n",
"\n",
"val1, val2 = np.loadtxt(outfile, delimiter=',', skiprows=1, usecols=(1, 2), unpack=True)\n",
"print(val1) # [123. 110. 164.]\n",
"print(val2) # [1.4 0.5 2.1]\n",
"```\n",
"\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"outfile = r'.\\data.csv'\n",
"x = np.genfromtxt(outfile, delimiter=',', names=True)\n",
"print(x)\n",
"# [(1., 123., 1.4, 23.) (2., 110., 0.5, 18.) (3., 164., 2.1, 19.)]\n",
"\n",
"print(type(x)) \n",
"# <class 'numpy.ndarray'>\n",
"\n",
"print(x.dtype)\n",
"# [('id', '<f8'), ('value1', '<f8'), ('value2', '<f8'), ('value3', '<f8')]\n",
"\n",
"print(x['id']) # [1. 2. 3.]\n",
"print(x['value1']) # [123. 110. 164.]\n",
"print(x['value2']) # [1.4 0.5 2.1]\n",
"print(x['value3']) # [23. 18. 19.]\n",
"```\n",
"\n",
"data1.csv文件\n",
"```python\n",
"id,value1,value2,value3\n",
"1,123,1.4,23\n",
"2,110,,18\n",
"3,,2.1,19\n",
"```\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"outfile = r'.\\data1.csv'\n",
"x = np.genfromtxt(outfile, delimiter=',', names=True)\n",
"print(x)\n",
"# [(1., 123., 1.4, 23.) (2., 110., nan, 18.) (3., nan, 2.1, 19.)]\n",
"\n",
"print(type(x)) \n",
"# <class 'numpy.ndarray'>\n",
"\n",
"print(x.dtype)\n",
"# [('id', '<f8'), ('value1', '<f8'), ('value2', '<f8'), ('value3', '<f8')]\n",
"\n",
"print(x['id']) # [1. 2. 3.]\n",
"print(x['value1']) # [123. 110. nan]\n",
"print(x['value2']) # [1.4 nan 2.1]\n",
"print(x['value3']) # [23. 18. 19.]\n",
"```\n",
"\n",
"---\n",
"## 文本格式选项\n",
"\n",
"- `numpy.set_printoptions(precision=None,threshold=None, edgeitems=None,linewidth=None, suppress=None, nanstr=None, infstr=None,formatter=None, sign=None, floatmode=None, **kwarg)` Set printing options.\n",
" - `precision`设置浮点精度控制输出的小数点个数默认是8。\n",
" - `threshold`概略显示超过该值则以“…”的形式来表示默认是1000。\n",
" - `linewidth`用于确定每行多少字符数后插入换行符默认为75。\n",
" - `suppress`:当`suppress=True`表示小数不需要以科学计数法的形式输出默认是False。\n",
" - `nanstr`:浮点非数字的字符串表示形式,默认`nan`。\n",
" - `infstr`:浮点无穷大的字符串表示形式,默认`inf`。\n",
"\n",
"These options determine the way floating point numbers, arrays and other NumPy objects are displayed.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"np.set_printoptions(precision=4)\n",
"x = np.array([1.123456789])\n",
"print(x) # [1.1235]\n",
"\n",
"np.set_printoptions(threshold=20)\n",
"x = np.arange(50)\n",
"print(x) # [ 0 1 2 ... 47 48 49]\n",
"\n",
"np.set_printoptions(threshold=np.iinfo(np.int).max)\n",
"print(x)\n",
"# [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n",
"# 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47\n",
"# 48 49]\n",
"\n",
"eps = np.finfo(float).eps\n",
"x = np.arange(4.)\n",
"x = x ** 2 - (x + eps) ** 2\n",
"print(x) \n",
"# [-4.9304e-32 -4.4409e-16 0.0000e+00 0.0000e+00]\n",
"np.set_printoptions(suppress=True)\n",
"print(x) # [-0. -0. 0. 0.]\n",
"\n",
"x = np.linspace(0, 10, 10)\n",
"print(x)\n",
"# [ 0. 1.1111 2.2222 3.3333 4.4444 5.5556 6.6667 7.7778 8.8889\n",
"# 10. ]\n",
"np.set_printoptions(precision=2, suppress=True, threshold=5)\n",
"print(x) # [ 0. 1.11 2.22 ... 7.78 8.89 10. ]\n",
"```\n",
"\n",
"- `numpy.get_printoptions()` Return the current print options.\n",
"\n",
"【例】\n",
"```python\n",
"import numpy as np\n",
"\n",
"x = np.get_printoptions()\n",
"print(x)\n",
"# {\n",
"# 'edgeitems': 3, \n",
"# 'threshold': 1000, \n",
"# 'floatmode': 'maxprec', \n",
"# 'precision': 8, \n",
"# 'suppress': False, \n",
"# 'linewidth': 75, \n",
"# 'nanstr': 'nan', \n",
"# 'infstr': 'inf', \n",
"# 'sign': '-', \n",
"# 'formatter': None, \n",
"# 'legacy': False\n",
"# }\n",
"```\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@@ -0,0 +1,131 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**创建一个形为5×3的二维数组以包含5到10之间的随机数。**\n",
"\n",
"【知识点:随机抽样】\n",
"- 如何创建随机二维数组?"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-06T03:02:49.540699Z",
"start_time": "2020-09-06T03:02:49.430660Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[6 7 6]\n",
" [5 6 5]\n",
" [8 8 8]\n",
" [9 8 7]\n",
" [8 7 6]]\n",
"[[7.17742843 9.67201535 6.03259923]\n",
" [9.67097091 9.08662124 5.13643319]\n",
" [7.51864734 7.7036486 7.8195777 ]\n",
" [5.50024593 9.66330664 5.18939603]\n",
" [8.34728051 5.3017636 6.30038456]]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"x = np.random.randint(5, 10, [5, 3])\n",
"print(x)\n",
"# [[5 8 8]\n",
"# [5 6 8]\n",
"# [8 8 7]\n",
"# [6 7 9]\n",
"# [6 5 8]]\n",
"\n",
"x = np.random.uniform(5, 10, [5, 3])\n",
"print(x)\n",
"# [[6.73675226 8.50271284 9.66526032]\n",
"# [9.42365472 7.56513263 7.86171898]\n",
"# [9.31718935 5.71579324 9.92067933]\n",
"# [8.90907128 8.05704153 6.0189007 ]\n",
"# [8.70753644 7.75056151 5.71714203]]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python35",
"language": "python",
"name": "python35"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}

File diff suppressed because one or more lines are too long