NumPy 100道练习题
本来是打算把这一百道题搞完,做到几十道发现绝大多数题都要学习新函数,本来是把函数作用和参数写到文章的,后来发现太多了就想着后面搞一个函数汇总吧。毕竟写这个的初衷是方便我以后看,但是现在发现好像不是很方便了,所以后面就没写函数了。
另外就是一直跟这玩意死磕到底实在是太浪费时间了,所以以后有时间会把这个在做一下补充吧大概。
目录
- NumPy 100道练习题
- 1. 导入numpy库并取别名为np (★☆☆)
- 2. 打印输出numpy的版本和配置信息 (★☆☆)
- 3. 创建长度为10的零向量 (★☆☆)
- 4. 获取数组所占内存大小 (★☆☆)
- 5. 怎么用命令行获取numpy add函数的文档说明? (★☆☆)
- 6. 创建一个长度为10的零向量,并把第五个值赋值为1 (★☆☆)
- 7. 创建一个值域为10到49的向量 (★☆☆)
- 8**. 将一个向量进行反转(第一个元素变为最后一个元素) (★☆☆)
- 9. 创建一个3x3的矩阵,值域为0到8**(★☆☆)
- 10. 从数组[1, 2, 0, 0, 4, 0]中找出非0元素的位置索引 (★☆☆)
- 11. 创建一个3x3的单位矩阵 (★☆☆)
- 12. 创建一个3x3x3的随机数组(★☆☆)
- 13. 创建一个10x10的随机数组,并找出该数组中的最大值与最小值(★☆☆)
- 14. 创建一个长度为30的随机向量,并求它的平均值 (★☆☆)
- 15. 创建一个2维数组,该数组边界值为1,内部的值为0 (★☆☆)
- 16. 如何用0来填充一个数组的边界? (★☆☆)
- 17. 下面表达式运行的结果是什么?(★☆☆)
- 18. 创建一个5x5的矩阵,且设置值1, 2, 3, 4在其对角线下面一行(★☆☆)
- 19. 创建一个8x8的国际象棋棋盘矩阵(黑块为0,白块为1) (★☆☆)
- 20. 思考一下形状为(6, 7, 8)的数组的形状,且第100个元素的索引(x, y, z)分别是什么?(★☆☆)
- 21. 用tile函数创建一个8x8的棋盘矩阵(★☆☆)
- 22. 对5x5的随机矩阵进行归一化 (★☆☆)
- 23. 创建一个dtype来表示颜色(RGBA) (★☆☆)
- 24. 一个5x3的矩阵和一个3x2的矩阵相乘,结果是什么?(★☆☆)
- 25. 给定一个一维数组把它索引从3到8的元素求相反数 (★☆☆)
- 26. 下面的脚本的结果是什么? (★☆☆)
- 27. 关于整形的向量Z下面哪些表达式正确? (★☆☆)
- 28. 下面表达式的结果分别是什么? (★☆☆)
- 29. 如何从零位开始舍入浮点数组? (★☆☆)
- 30. 如何找出两个数组公共的元素? (★☆☆)
- 31. 如何忽略numpy的警告信息(不推荐)? (★☆☆)
- 32. 下面的表达式是否为真? (★☆☆)
- 33. 如何获得昨天,今天和明天的日期? (★☆☆)
- 34. 怎么获得所有与2016年7月的所有日期? (★★☆)
- 35. 如何计算 ((A+B)*(-A/2)) (不使用中间变量)? (★★☆)
- 36. 用5种不同的方法提取随机数组中的整数部分 (★★☆)
- 37. 创建一个5x5的矩阵且每一行的值范围为从0到4 (★★☆)
- 38. 如何用一个生成10个整数的函数来构建数组 (★☆☆)
- 39. 创建一个大小为10的向量, 值域为0到1,不包括0和1 (★★☆)
- 40. 创建一个大小为10的随机向量,并把它排序 (★★☆)
- 41. 对一个小数组进行求和有没有办法比np.sum更快? (★★☆)
- 42. 如何判断两随机数组相等 (★★☆)
- 43. 把数组变为只读 (★★☆)
- 44. 将一个10x2的笛卡尔坐标矩阵转换为极坐标 (★★☆)
- 45. 创建一个大小为10的随机向量并且将该向量中最大的值替换为0**(★★☆)
- 46. 创建一个结构化数组,其中x和y坐标覆盖[0, 1]x[1, 0]区域 (★★☆)
- 47. 给定两个数组X和Y,构造柯西(Cauchy)矩阵C( C i , j = 1 x i − y j C_{i,j}=\frac{1}{x_i-y_j} Ci,j=xi−yj1)(★★☆)
- 48. 打印每个numpy 类型的最小和最大可表示值 (★★☆)
- 49. 如何打印数组中所有的值?(★★☆)
- 50. 如何在数组中找到与给定标量接近的值? (★★☆)
- 51. 创建表示位置(x, y)和颜色(r, g, b, a)的结构化数组 (★★☆)
- 52. 思考形状为(100, 2)的随机向量,求出点与点之间的距离 (★★☆)
- 53. 如何将类型为float(32位)的数组类型转换为integer(32位)? (★★☆)
- 54. 如何读取下面的文件? (★★☆)
- 55. numpy数组枚举(enumerate)的等价操作? (★★☆)
- 56. 构造一个二维高斯矩阵**(★★☆)
- 57. 如何在二维数组的随机位置放置p个元素? (★★☆)
- 58. 减去矩阵每一行的平均值 (★★☆)
- 59. 如何对数组通过第n列进行排序? (★★☆)
- 60. 如何判断一个给定的二维数组存在空列? (★★☆)
- 61. 从数组中找出与给定值最接近的值 (★★☆)
- 62. 思考形状为(1, 3)和(3, 1)的两个数组形状,如何使用迭代器计算它们的和? (★★☆)
- 63. 创建一个具有name属性的数组类 (★★☆)
- 64. 给定一个向量,如何让在第二个向量索引的每个元素加1(注意重复索引)? (★★★)
- 65. 如何根据索引列表I将向量X的元素累加到数组F? (★★★)
- 66. 思考(dtype = ubyte)的(w, h, 3)图像,计算唯一颜色的值(★★★)
- 67. 思考如何求一个四维数组最后两个轴的数据和(★★★)
- 68. 考虑一维向量D,如何使用相同大小的向量S来计算D的子集的均值,其描述子集索引? (★★★)
- 69. 如何获得点积的对角线? (★★★)
- 70.考虑向量[1,2,3,4,5],如何建立一个新的向量,在每个值之间交错有3个连续的零? (★★★)
- 71. 考虑一个维度(5,5,3)的数组,如何将其与一个(5,5)的数组相乘? (★★★)
- 72. 如何对一个数组中任意两行做交换? (★★★)
- 73. 思考描述10个三角形(共享顶点)的一组10个三元组,找到组成所有三角形的唯一线段集 (★★★)
- 74. 给定一个二进制的数组C,如何生成一个数组A满足np.bincount(A)==C? (★★★)
- 75. 如何通过滑动窗口计算一个数组的平均数? (★★★)
- 76. 思考以为数组Z,构建一个二维数组,其第一行是(Z[0],Z[1],Z[2]), 然后每一行移动一位,最后一行为 (Z[-3],Z[-2],Z[-1]) (★★★)
- 77. 如何对布尔值取反,或改变浮点数的符号(sign)? (★★★)
- 78. 思考两组点集P0和P1去描述一组线(二维)和一个点p,如何计算点p到每一条线 i (P0[i],P1[i])的距离? (★★★)
- 79. 考虑两组点集P0和P1去描述一组线(二维)和一组点集P,如何计算每一个点 j(P[j]) 到每一条线 i (P0[i],P1[i])的距离? (★★★)
- 80. 思考一个任意的数组,编写一个函数,该函数提取一个具有固定形状的子部分,并以一个给定的元素为中心(在该部分填充值) (★★★)
- 81. 考虑一个数组Z = [1,2,3,4,5,6,7,8,9,10,11,12,13,14],如何生成一个数组R = [[1,2,3,4], [2,3,4,5], [3,4,5,6], ...,[11,12,13,14]]? (★★★)
- 82. 计算矩阵的秩 (★★★)
- 83. 如何找出数组中出现频率最高的值?(★★★)
- 84. 从一个10x10的矩阵中提取出连续的3x3区块**(★★★)
- 85.创建一个满足 Z[i,j] == Z[j,i]的二维数组子类 (★★★)
- 86. 考虑p个 nxn 矩阵和一组形状为(n,1)的向量,如何直接计算p个矩阵的乘积(n,1)? (★★★)
- 87. 对于一个16x16的数组,如何得到一个区域的和(区域大小为4x4)? (★★★)
- 88. 如何利用numpy数组实现Game of Life? (★★★)
- 89. 如何找到一个数组的第n个最大值?** (★★★)
- 90. 给定任意个数向量,创建笛卡尔积(每一个元素的每一种组合) (★★★)
- 91. 如何从一个常规数组中创建记录数组(record array)? (★★★)
- 92. 思考一个大向量Z, 用三种不同的方法计算它的立方 (★★★)
- 93. 考虑两个形状分别为(8,3) 和(2,2)的数组A和B. 如何在数组A中找到满足包含B中元素的行?(不考虑B中每行元素顺序)? (★★★)
- 94. 思考一个10x3的矩阵,如何分解出有不全相同值的行 (如 [2,2,3])(★★★)
- 95. 将一个整数向量转换为二进制矩阵 (★★★)
- 96. 给定一个二维数组,如何提取出唯一的行?(★★★)
- 97. 考虑两个向量A和B,写出用einsum等式对应的inner, outer, sum, mul函数 (★★★)
- 98. 考虑一个由两个向量描述的路径(X,Y),如何用等距样例(equidistant samples)对其进行采样(sample)(★★★)?
- 99. 给定一个整数n 和一个二维数组X,从X中选择可以被解释为从多n度的多项分布式的行,即这些行只包含整数对n的和. (★★★)
- 100. 对于一个一维数组X,计算它boostrapped之后的95%置信区间的平均值. (★★★)
1. 导入numpy库并取别名为np (★☆☆)
(提示: import … as …)
import numpy as np
2. 打印输出numpy的版本和配置信息 (★☆☆)
(提示: np.verison, np.show_config)
print (np.__version__)
np.show_config()
3. 创建长度为10的零向量 (★☆☆)
(提示: np.zeros)
a = np.zeros(10)
4. 获取数组所占内存大小 (★☆☆)
(提示: size, itemsize)
a.size * a.itemsize
5. 怎么用命令行获取numpy add函数的文档说明? (★☆☆)
(提示: np.info)
np.info(np.add)
6. 创建一个长度为10的零向量,并把第五个值赋值为1 (★☆☆)
(提示: array[4])
a = np.zeros(10)
a[4] = 1
7. 创建一个值域为10到49的向量 (★☆☆)
(提示: np.arange)
a = np.arange(10,50)
8**. 将一个向量进行反转(第一个元素变为最后一个元素) (★☆☆)
(提示: array[::-1])
a[::-1] # 按照-1步长切片
9. 创建一个3x3的矩阵,值域为0到8**(★☆☆)
(提示: reshape)
a = np.arange(0,9)
a.reshape(3,3)
10. 从数组[1, 2, 0, 0, 4, 0]中找出非0元素的位置索引 (★☆☆)
(提示: np.nonzero)
np.nonzero([1, 2, 0, 0, 4, 0]) # 返回一个数组,为非0位的索引
11. 创建一个3x3的单位矩阵 (★☆☆)
(提示: np.eye)
np.eye(3,3)
12. 创建一个3x3x3的随机数组(★☆☆)
(提示: np.random.random)
np.random.random((3,3,3))
注:
np.random.random()
返回0-1之间指定维度下的随机数
13. 创建一个10x10的随机数组,并找出该数组中的最大值与最小值(★☆☆)
(提示: max, min)
a = np.random.random((10,10))
a.max()
a.min()
14. 创建一个长度为30的随机向量,并求它的平均值 (★☆☆)
(提示: mean)
a = np.random.random(30)
a.mean()
15. 创建一个2维数组,该数组边界值为1,内部的值为0 (★☆☆)
(提示: array[1:-1, 1:-1])
a = np.ones((10,10))
a[1:-1, 1:-1] = 0
16. 如何用0来填充一个数组的边界? (★☆☆)
(提示: np.pad)
a = np.ones((10, 10))
a = np.pad(Z, pad_width=2, mode='constant', constant_values=0)
注:
np.pad()
np.pad详细用法:
python: np.pad() 函数的用法
17. 下面表达式运行的结果是什么?(★☆☆)
(提示: NaN = not a number, inf = infinity)
(提示:NaN : 不是一个数,inf : 无穷)
# 表达式 # 结果
0 * np.nan nan
np.nan == np.nan False
np.inf > np.nan False
np.nan - np.nan nan
0.3 == 3 * 0.1 False
18. 创建一个5x5的矩阵,且设置值1, 2, 3, 4在其对角线下面一行(★☆☆)
(提示: np.diag)
np.diag([1, 2, 3, 4], k=-1)
np.diag()
对于np.diag():
如果输入是二维数组,以向量形式返回对角线元素。
如果输入是一维数组,返回一个以输入为对角线的二维数组。
19. 创建一个8x8的国际象棋棋盘矩阵(黑块为0,白块为1) (★☆☆)
(提示: array[::2])
a = np.zeros(64).reshape(8,8)
a[1::2, ::2] = 1
a[::2, 1::2] = 1
20. 思考一下形状为(6, 7, 8)的数组的形状,且第100个元素的索引(x, y, z)分别是什么?(★☆☆)
(提示: np.unravel_index)
print (np.unravel_index(100, (6, 7, 8)))
注:
unravel_index()
完整函数定义:unravel_index(indices, shape, order=‘C’)
indices
就是索引值,可以是一个数,也可以是一个列表。shape
代表的是数组的形状order
有两种取值:“C”表示的是以横坐标为基准;“F”表示的是以纵坐标为基准。
函数的作用就是得到 indices 中每一项对应到形状为shape的数组中的坐标。
21. 用tile函数创建一个8x8的棋盘矩阵(★☆☆)
(提示: np.tile)
a = np.array([[1, 0], [0, 1]])
np.tile(a,[4,4])
注:
np.tile()
np.tile()可以实现对数组的复制,接收两个输入值
- 第一个输入为需要被复制的数组;
- 第二个输入为一个数组,他表示向各个方向复制的倍数。
如果第二个输入为[2, 3],则表示为:y轴复制两遍,x轴复制3遍。
22. 对5x5的随机矩阵进行归一化 (★☆☆)
(提示: (x - min) / (max - min))
a = np.random.random((5, 5))
a = (a - a.min()) / (a.max() - a.min())
23. 创建一个dtype来表示颜色(RGBA) (★☆☆)
(提示: np.dtype)
color = np.dtype([("r", np.uint8),
("g", np.uint8),
("b", np.uint8),
("a", np.uint8)])
a = np.array((255, 255, 255, 1), dtype=color)
24. 一个5x3的矩阵和一个3x2的矩阵相乘,结果是什么?(★☆☆)
(提示: np.dot | @)
a = np.arange(15).reshape(5, 3)
b = np.arange(6).reshape(3, 2)
np.dot(a, b)
注:
np.dot()
np.dot()函数主要有两个功能,向量点积和矩阵乘法,即把传入的两个数据相乘。
25. 给定一个一维数组把它索引从3到8的元素求相反数 (★☆☆)
(提示: >, <=)
a = np.arange(10)
a[(a >= 3) & (a <= 8)] *= -1
26. 下面的脚本的结果是什么? (★☆☆)
(提示: np.sum)
# Author: Jake VanderPlas # 结果
print(sum(range(5),-1)) 9
from numpy import np
print(np.sum(range(5),-1)) 10 # np.sum(a, axis=None)
sum()
sum(iterable[, start])
:
- iterable – 可迭代对象,如:列表、元组、集合。
- start – 指定相加的参数,如果没有设置这个值,默认为0。
np.sum()
关于np.sum()请看:
python 中 np.sum()函数 通俗易懂理解!
numpy.sum()的使用
27. 关于整形的向量Z下面哪些表达式正确? (★☆☆)
Z**Z True
2 << Z >> 2 False
Z <- Z True
1j*Z True # 复数
Z/1/1 True
Z<Z>Z False
28. 下面表达式的结果分别是什么? (★☆☆)
np.array(0) / np.array(0) nan
np.array(0) // np.array(0) 0
np.array([np.nan]).astype(int).astype(float) -2.14748365e+09
29. 如何从零位开始舍入浮点数组? (★☆☆)
(提示: np.uniform, np.copysign, np.ceil, np.abs)
a = np.random.uniform(-10,+10,10)
print (np.copysign(np.ceil(np.abs(a)), a))
np.random.unform()
np.random.uniform(low, high ,size)
:
- 函数作用:指定范围内生成指定数量的随机数。
- low:采样区域的下界,float类型或者int类型或者数组类型或者迭代类型,默认值为0
- high:采样区域的上界,float类型或者int类型或者数组类型或者迭代类型,默认值为1
- size:输出样本的数目(int类型或者tuple类型或者迭代类型)
- 返回对象:ndarray类型,形状和size中的数值一样
abs()、np.abs()
- 函数作用:对输入取绝对值。
- 返回值:abs()返回int、numpy.abs()返回ndarray。
- 注意:单个元素用abs()、多个元素并行处理用numpy.abs(),可以提高效率。
np.ceil()、 np.floor()
- 函数作用:对输入浮点数取整。
- ceiling向上取整,floor向下取整(即使用np.ceil()结果 ≥ 输入)
numpy.copysign()
numpy.copysign(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'copysign'>
:
- 函数作用:将x1的符号改为x2的符号,按元素排序。如果 x2 是一个标量,它的符号将被复制到 x1 。
- x1:array_like
要更改的符号的值。 - x2:array_like
符号 x2 复制到 x1 。如果 x1.shape != x2.shape ,它们必须可以广播到公共形状(成为输出的形状)。 - out:ndarray、none或ndarray和none的元组,可选
存储结果的位置。如果提供,它必须具有输入广播到的形状。如果未提供或没有,则返回新分配的数组。元组(只能作为关键字参数)的长度必须等于输出数。 - where:阵列式,可选
这种情况通过输入广播。在条件为真的位置 out 数组将被设置为ufunc结果。在其他地方 out 数组将保留其原始值。请注意,如果未初始化 out 数组是通过默认值创建的 out=None ,其中条件为False的位置将保持未初始化状态。 - 返回:outndarray或scalar
价值观 x1 带有 x2 . 这是一个标量,如果两者都是 x1 和 x2 是标量。
30. 如何找出两个数组公共的元素? (★☆☆)
(提示: np.intersect1d)
a = np.arange(1,10)
b = np.arange(5, 11)
np.intersect1d(a, b)
np.intersect1d()
numpy.intersect1d(arr1, arr2, assume_unique = False, return_indices = False)
:
- 函数作用:查找两个数组的交集,并返回两个输入数组中都有序的,唯一的值。
- arr1,arr2:输入数组。
- assume_unique:如果为True,则假定输入数组都是唯一的,这可以加快计算速度。默认值为False。
- return_indices:如果为True,则返回与两个数组的交集相对应的索引。如果有多个值,则使用值的第一个实例。默认值为False。
- Return :常见和唯一元素的排序一维数组。
31. 如何忽略numpy的警告信息(不推荐)? (★☆☆)
(提示: np.seterr, np.errstate)
# Suicide mode on
defaults = np.seterr(all="ignore")
Z = np.ones(1) / 0
# Back to sanity
_ = np.seterr(**defaults)
# 另一个等价的方式, 使用上下文管理器(context manager)
with np.errstate(divide='ignore'):
Z = np.ones(1) / 0
np.seterr()
numpy.seterr(all=None, divide=None, over=None, under=None, invalid=None)
:
- 函数作用:设置如何处理浮点错误。
- all: {‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’},可选
一次性设置所有类型的浮点错误的处理:
–> ignore:发生异常时不采取任何措施。
–> warn:打印一个RuntimeWarning(通过 Pythonwarnings模块)。
–> raise:提高一个FloatingPointError.
–> call:调用使用seterrcall函数指定的函数。
–> print:直接向 stdout 打印警告。
–> log:在 seterrcall 指定的 Log 对象中记录错误。
默认是不改变当前行为。 - divide: {‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’},可选
除以零的处理。 - over: {‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’},可选
浮点溢出的处理。 - under: {‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’},可选
浮点下溢的处理。 - invalid: {‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’},可选
无效浮点运算的处理。
np.errstate()
numpy.errstate(**kwargs)
:
- 用于浮点错误处理的上下文管理器。
- kwargs: {除,超过,低于,无效}
关键字参数。有效的关键字是可能的浮点异常。每个关键字都应该有一个字符串值,用于定义特定错误的处理方式。可能的值为 {‘ignore’, ‘warn’, ‘raise’, ‘call’, ‘print’, ‘log’}。
32. 下面的表达式是否为真? (★☆☆)
(提示: 虚数)
np.sqrt(-1) == np.emath.sqrt(-1) False
np.sqrt()
numpy.sqrt(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'sqrt'
:
- 函数作用:对数组每个元素返回一个非负平方根
- X:array_like 输入数据
- out:(可选参数)指定结果的存储位置。如果提供这个参数请确保其具有广播机制=输入的shape。如果不提供该参数或者为None,将返回一个新的数组。一个元组(可能只是作为一个关键词参数)必须拥有和输出相等的长度。
- where:(可选参数)此条件通过输入广播。如果为 True ,out数组将设置为 ufunc 结果。在其他地方,out数组将保留其原始值。请注意,如果通过默认的 out 数组创建未初始化的out数组,则其中条件为 False 的位置将保持未初始化状态。
- 返回: y:ndarray
返回一个和X一样的shape的数组,每个元素都是X中元素的非负平方根。 - 如果X所有元素都为实数(标量),则y中元素也全为实数(标量);对于X中的负实数,在y中会显示为nan。
- 如果X中存在至少一个元素为复数,则返回的数组y中元素全为复数。
np.sqrt()与np.emath.sqrt()
这两个不同的地方在于,前者只能接受一个大于0的数,也就是前面的运算只能得到一个实数;而后者可以接受一个负数,运算结果也可以是一个虚数。
33. 如何获得昨天,今天和明天的日期? (★☆☆)
(提示: np.datetime64, np.timedelta64)
yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')
today = np.datetime64('today', 'D')
tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D')
34. 怎么获得所有与2016年7月的所有日期? (★★☆)
(提示: np.arange(dtype=datetime64[‘D’]))
np.arange('2016-07', '2016-08', dtype='datetime64[D]')
datetime64
这里大概用到的就是数据类型datetime64
,日期单位是年(‘Y’),月(‘M’),周(‘W’)和天(‘D’), 而时间单位是小时(‘h’),分钟(‘m’) ),秒(‘s’), 毫秒(‘ms’)。
关于日期的函数有挺多,感觉用不太上,在这里就放个链接方便后面再看叭。
日期时间和时间增量
35. 如何计算 ((A+B)*(-A/2)) (不使用中间变量)? (★★☆)
合理使用out可以提升时空效率。
(提示: np.add(out=), np.negative(out=), np.multiply(out=), np.divide(out=))
A = np.ones(3) * 1
B = np.ones(3) * 1
C = np.ones(3) * 1
np.add(A, B, out=B)
np.divide(A, 2, out=A)
np.negative(A, out=A)
np.multiply(A, B, out=A)
36. 用5种不同的方法提取随机数组中的整数部分 (★★☆)
(提示: %, np.floor, np.ceil, astype, np.trunc)
a = np.random.uniform(0, 10, 10)
a - a % 1
np.floor(a) # 向下取整
np.ceil(a)-1 # 向上取整
a.astype(int) # 转换numpy数组为int类型
np.trunc(a)
关于取整函数:
函数名 | 功能 |
---|---|
numpy.ceil(x,) | 向正无穷取整,⌈ x ⌉ |
numpy.floor(x,) | 向负无穷取整,⌊ x ⌋ |
numpy.trunc/fix(x,) | 截取整数部分 |
numpy.rint(x,) | 四舍五入到最近整数 |
numpy.around(x,) | 四舍五入到给定的小数位 |
示例代码:
>>> a = np.array([-1.7, -1.1, -0.6, -0.2, 0.4, 0.6, 1.3, 2.0])
>>> a
array([-1.7, -1.1, -0.6, -0.2, 0.4, 0.6, 1.3, 2. ])
>>> np.ceil(a)
array([-1., -1., -0., -0., 1., 1., 2., 2.])
>>> np.floor(a)
array([-2., -2., -1., -1., 0., 0., 1., 2.])
>>> np.trunc(a)
array([-1., -1., -0., -0., 0., 0., 1., 2.])
>>> np.rint(a)
array([-2., -1., -1., -0., 0., 1., 1., 2.])
>>> np.around(a)
array([-2., -1., -1., -0., 0., 1., 1., 2.])
37. 创建一个5x5的矩阵且每一行的值范围为从0到4 (★★☆)
(提示: np.arange)
a = np.zeros((5, 5))
a += np.arange(5)
a
38. 如何用一个生成10个整数的函数来构建数组 (★☆☆)
(提示: np.fromiter)
def generate():
for x in range(10):
yield x
np.fromiter(generate(), dtype=float, count=-1)
np.fromiter()
np.fromiter(iterable, dtype, count = -1)
从一个循环对象中提取数字,产生新的数组
- Iterable: 为生成数组提供数据的对象
- dtype: 生成的数组內数据类型
np.fromiter()一般和for循环一起使用:
>>> iterable = (x*x for x in range(5))
>>> np.fromiter(iterable, float)
array([ 0., 1., 4., 9., 16.])
39. 创建一个大小为10的向量, 值域为0到1,不包括0和1 (★★☆)
(提示: np.linspace)
np.linspace(0, 1, 12, endpoint=True)[1: -1]
np.linspace()
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
-
函数功能:生成一个指定大小,指定数据区间的均匀分布序列。
-
start:序列中数据的下界。
-
end:序列中数据的上界。
-
num:生成序列包含num个元素;其值默认为50。
-
endpoint:取True时,序列包含最大值end;否则不包含;其值默认为True。
-
retstep:该值取True时,生成的序列中显示间距;反正不显示;其值默认为false。
-
dtype:数据类型,可以指定生成序列的数据类型;当为None时,根据其他输入推断数据类型。
-
返回值:是一个数组。
40. 创建一个大小为10的随机向量,并把它排序 (★★☆)
(提示: sort)
a = np.random.random(10)
a.sort()
a
list.sort()
list.sort(cmp=None, key=None, reverse=False)
- 函数作用:用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。
- cmp:可选参数, 如果指定了该参数会使用该参数的方法进行排序。
- key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse:排序规则,reverse = True 降序, reverse = False 升序(默认)。
41. 对一个小数组进行求和有没有办法比np.sum更快? (★★☆)
(提示: np.add.reduce)
# Author: Evgeni Burovski
Z = np.arange(10)
np.add.reduce(Z)
# np.add.reduce 是numpy.add模块中的一个ufunc(universal function)函数,C语言实现
等价于np.cumsum(Z)
42. 如何判断两随机数组相等 (★★☆)
(提示: np.allclose, np.array_equal)
A = np.random.randint(0, 2, 5)
B = np.random.randint(0, 2, 5)
# 假设array的形状(shape)相同和一个误差容限(tolerance)
equal = np.allclose(A,B)
print(equal)
# 检查形状和元素值,没有误差容限(值必须完全相等)
equal = np.array_equal(A,B)
print(equal)
43. 把数组变为只读 (★★☆)
(提示: flags.writeable)
a = np.zeros(5)
a.flags.writeable = False
44. 将一个10x2的笛卡尔坐标矩阵转换为极坐标 (★★☆)
(提示: np.sqrt, np.arctan2)
Z = np.random.random((10, 2))
X, Y = Z[:, 0], Z[:, 1]
R = np.sqrt(X**2 + Y**2)
T = np.arctan2(Y, X)
print (R)
print (T)
45. 创建一个大小为10的随机向量并且将该向量中最大的值替换为0**(★★☆)
(提示: argmax)
a = np.random.random(10)
a[a.argmax()] = 0
numpy.argmax()
numpy.argmax(a, axis=None, out=None)
- 函数功能,返回最大值的索引
- 若axis=1,输出每行中最大值的索引,
- 若axis=0,则输出每列中最大值的索引。
46. 创建一个结构化数组,其中x和y坐标覆盖[0, 1]x[1, 0]区域 (★★☆)
(提示: np.meshgrid)
a = np.zeros((5, 5), [('x', float), ('y', float)])
a['x'], Z['y'] = np.meshgrid(np.linspace(0, 1, 5), np.linspace(0, 1, 5))
a
np.meshgrid()
做这道题的时候,没咋看明白,方便以后看吧,放个链接:
numpy.meshgrid()理解
47. 给定两个数组X和Y,构造柯西(Cauchy)矩阵C( C i , j = 1 x i − y j C_{i,j}=\frac{1}{x_i-y_j} Ci,j=xi−yj1)(★★☆)
# Author: Evgeni Burovski
X = np.arange(8)
Y = X + 0.5
C = 1.0 / np.subtract.outer(X, Y)
print (C)
print(np.linalg.det(C)) # 计算行列式
48. 打印每个numpy 类型的最小和最大可表示值 (★★☆)
(提示: np.iinfo, np.finfo, eps)
for dtype in [np.int8, np.int32, np.int64]:
print(np.iinfo(dtype).min)
print(np.iinfo(dtype).max)
for dtype in [np.float32, np.float64]:
print(np.finfo(dtype).min)
print(np.finfo(dtype).max)
print(np.finfo(dtype).eps)
49. 如何打印数组中所有的值?(★★☆)
(提示: np.set_printoptions)
np.set_printoptions(threshold=np.nan)
a = np.zeros((16,16))
a
注:这答案运行不了>_<
np.set_printoptions()
np.set_printoptions(precision=None, threshold=None, linewidth=None, suppress=None, formatter=None)
- 函数作用:数的显示精度。
- precision:控制输出结果的精度(即小数点后的位数),默认值为8
- threshold:当数组元素总数过大时,设置显示的数字位数,其余用省略号代替(当数组元素总数大于设置值,控制输出值得个数为6个,当数组元素小于或者等于设置值得时候,全部显示),当设置值为sys.maxsize(需要导入sys库),则会输出所有元素
- linewidth:每行字符的数目,其余的数值会换到下一行
- suppress:小数是否需要以科学计数法的形式输出
- formatter:自定义输出规则
50. 如何在数组中找到与给定标量接近的值? (★★☆)
(提示: argmin)
Z = np.arange(100)
v = np.random.uniform(0, 100)
index = (np.abs(Z-v)).argmin()
print(Z[index])
np.argmin()
np.argmin(a, axis=None, out=None)
- 函数作用:返回
axis
方向最小值的下标 - a : 数据输入
- axis : 默认将输入数组展平。否则,按照axis方向
- out : 可选
51. 创建表示位置(x, y)和颜色(r, g, b, a)的结构化数组 (★★☆)
(提示: dtype)
Z = np.zeros(10, [('position', [('x', float, 1),
('y', float, 1)]),
('color', [('r', float, 1),
('g', float, 1),
('b', float, 1)])])
print (Z)
52. 思考形状为(100, 2)的随机向量,求出点与点之间的距离 (★★☆)
(提示: np.atleast_2d, T, np.sqrt)
Z = np.random.random((100, 2))
X, Y = np.atleast_2d(Z[:, 0], Z[:, 1])
D = np.sqrt((X-X.T)**2 + (Y-Y.T)**2)
print (D)
# 使用scipy库可以更快
import scipy.spatial
Z = np.random.random((100,2))
D = scipy.spatial.distance.cdist(Z,Z)
print(D)
53. 如何将类型为float(32位)的数组类型转换为integer(32位)? (★★☆)
(提示: astype(copy=False))
Z = np.arange(10, dtype=np.int32)
Z = Z.astype(np.float32, copy=False)
print(Z)
54. 如何读取下面的文件? (★★☆)
(提示: np.genfromtxt)
1, 2, 3, 4, 5
6, , , 7, 8
, , 9,10,11
# 先把上面保存到文件example.txt中
# 这里不使用StringIO, 因为Python2 和Python3 在这个地方有兼容性问题
Z = np.genfromtxt("example.txt", delimiter=",")
print(Z)
55. numpy数组枚举(enumerate)的等价操作? (★★☆)
(提示: np.ndenumerate, np.ndindex)
Z = np.arange(9).reshape(3,3)
for index, value in np.ndenumerate(Z):
print(index, value)
for index in np.ndindex(Z.shape):
print(index, Z[index])
56. 构造一个二维高斯矩阵**(★★☆)
(提示: np.meshgrid, np.exp)
X, Y = np.meshgrid(np.linspace(-1, 1, 10), np.linspace(-1, 1, 10))
D = np.sqrt(X**2 + Y**2)
sigma, mu = 1.0, 0.0
G = np.exp(-( (D-mu)**2 / (2.0*sigma**2) ))
print (G)
57. 如何在二维数组的随机位置放置p个元素? (★★☆)
(提示: np.put, np.random.choice)
# Author: Divakar
n = 10
p = 3
Z = np.zeros((n,n))
np.put(Z, np.random.choice(range(n*n), p, replace=False),1)
print(Z)
58. 减去矩阵每一行的平均值 (★★☆)
(提示: mean(axis=,keepdims=))
# Author: Warren Weckesser
X = np.random.rand(5, 10)
# 新
Y = X - X.mean(axis=1, keepdims=True)
# 旧
Y = X - X.mean(axis=1).reshape(-1, 1)
print(Y)
59. 如何对数组通过第n列进行排序? (★★☆)
(提示: argsort)
# Author: Steve Tjoa
Z = np.random.randint(0,10,(3,3))
print(Z)
print(Z[ Z[:,1].argsort() ])
60. 如何判断一个给定的二维数组存在空列? (★★☆)
(提示: any, ~)
# Author: Warren Weckesser
Z = np.random.randint(0,3,(3,10))
print((~Z.any(axis=0)).any())
61. 从数组中找出与给定值最接近的值 (★★☆)
(提示: np.abs, argmin, flat)
Z = np.random.uniform(0,1,10)
z = 0.5
m = Z.flat[np.abs(Z - z).argmin()]
print(m)
62. 思考形状为(1, 3)和(3, 1)的两个数组形状,如何使用迭代器计算它们的和? (★★☆)
(提示: np.nditer)
A = np.arange(3).reshape(3, 1)
B = np.arange(3).reshape(1, 3)
it = np.nditer([A, B, None])
for x, y, z in it:
z[...] = x + y
print (it.operands[2])
63. 创建一个具有name属性的数组类 (★★☆)
(提示: class method)
class NameArray(np.ndarray):
def __new__(cls, array, name="no name"):
obj = np.asarray(array).view(cls)
obj.name = name
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.info = getattr(obj, 'name', "no name")
Z = NamedArray(np.arange(10), "range_10")
print (Z.name)
64. 给定一个向量,如何让在第二个向量索引的每个元素加1(注意重复索引)? (★★★)
(提示: np.bincount | np.add.at)
# Author: Brett Olsen
Z = np.ones(10)
I = np.random.randint(0,len(Z),20)
Z += np.bincount(I, minlength=len(Z))
print(Z)
# Another solution
# Author: Bartosz Telenczuk
np.add.at(Z, I, 1)
print(Z)
65. 如何根据索引列表I将向量X的元素累加到数组F? (★★★)
(提示: np.bincount)
# Author: Alan G Isaac
X = [1,2,3,4,5,6]
I = [1,3,9,3,4,1]
F = np.bincount(I,X)
print(F)
66. 思考(dtype = ubyte)的(w, h, 3)图像,计算唯一颜色的值(★★★)
(提示: np.unique)
# Author: Nadav Horesh
w,h = 16,16
I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)
F = I[...,0]*256*256 + I[...,1]*256 +I[...,2]
n = len(np.unique(F))
print(np.unique(I))
67. 思考如何求一个四维数组最后两个轴的数据和(★★★)
(提示: sum(axis=(-2,-1)))
A = np.random.randint(0,10,(3,4,3,4))
# 传递一个元组(numpy 1.7.0)
sum = A.sum(axis=(-2,-1))
print(sum)
# 将最后两个维度压缩为一个
# (适用于不接受轴元组参数的函数)
sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1)
print(sum)
68. 考虑一维向量D,如何使用相同大小的向量S来计算D的子集的均值,其描述子集索引? (★★★)
(提示: np.bincount)
# Author: Jaime Fernández del Río
D = np.random.uniform(0,1,100)
S = np.random.randint(0,10,100)
D_sums = np.bincount(S, weights=D)
D_counts = np.bincount(S)
D_means = D_sums / D_counts
print(D_means)
# Pandas solution as a reference due to more intuitive code
import pandas as pd
print(pd.Series(D).groupby(S).mean())
69. 如何获得点积的对角线? (★★★)
(提示: np.diag)
# Author: Mathieu Blondel
A = np.random.uniform(0,1,(5,5))
B = np.random.uniform(0,1,(5,5))
# Slow version
np.diag(np.dot(A, B))
# Fast version
np.sum(A * B.T, axis=1)
# Faster version
np.einsum("ij,ji->i", A, B)
70.考虑向量[1,2,3,4,5],如何建立一个新的向量,在每个值之间交错有3个连续的零? (★★★)
(提示: array[::4])
# Author: Warren Weckesser
Z = np.array([1,2,3,4,5])
nz = 3
Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz))
Z0[::nz+1] = Z
print(Z0)
71. 考虑一个维度(5,5,3)的数组,如何将其与一个(5,5)的数组相乘? (★★★)
(提示: array[:, :, None])
A = np.ones((5,5,3))
B = 2*np.ones((5,5))
print(A * B[:,:,None])
72. 如何对一个数组中任意两行做交换? (★★★)
(提示: array[[]] = array[[]])
# Author: Eelco Hoogendoorn
A = np.arange(25).reshape(5,5)
A[[0,1]] = A[[1,0]]
print(A)
73. 思考描述10个三角形(共享顶点)的一组10个三元组,找到组成所有三角形的唯一线段集 (★★★)
(提示: repeat, np.roll, np.sort, view, np.unique)
# Author: Nicolas P. Rougier
faces = np.random.randint(0,100,(10,3))
F = np.roll(faces.repeat(2,axis=1),-1,axis=1)
F = F.reshape(len(F)*3,2)
F = np.sort(F,axis=1)
G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] )
G = np.unique(G)
print(G)
74. 给定一个二进制的数组C,如何生成一个数组A满足np.bincount(A)==C? (★★★)
(提示: np.repeat)
# Author: Jaime Fernández del Río
C = np.bincount([1,1,2,3,4,4,6])
A = np.repeat(np.arange(len(C)), C)
print(A)
75. 如何通过滑动窗口计算一个数组的平均数? (★★★)
(提示: np.cumsum)
# Author: Jaime Fernández del Río
def moving_average(a, n=3) :
ret = np.cumsum(a, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1:] / n
Z = np.arange(20)
print(moving_average(Z, n=3))
76. 思考以为数组Z,构建一个二维数组,其第一行是(Z[0],Z[1],Z[2]), 然后每一行移动一位,最后一行为 (Z[-3],Z[-2],Z[-1]) (★★★)
(提示: from numpy.lib import stride_tricks)
# Author: Joe Kington / Erik Rigtorp
from numpy.lib import stride_tricks
def rolling(a, window):
shape = (a.size - window + 1, window)
strides = (a.itemsize, a.itemsize)
return stride_tricks.as_strided(a, shape=shape, strides=strides)
Z = rolling(np.arange(10), 3)
print(Z)
77. 如何对布尔值取反,或改变浮点数的符号(sign)? (★★★)
(提示: np.logical_not, np.negative)
# Author: Nathaniel J. Smith
Z = np.random.randint(0,2,100)
np.logical_not(Z, out=Z)
Z = np.random.uniform(-1.0,1.0,100)
np.negative(Z, out=Z)
78. 思考两组点集P0和P1去描述一组线(二维)和一个点p,如何计算点p到每一条线 i (P0[i],P1[i])的距离? (★★★)
def distance(P0, P1, p):
T = P1 - P0
L = (T**2).sum(axis=1)
U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L
U = U.reshape(len(U),1)
D = P0 + U*T - p
return np.sqrt((D**2).sum(axis=1))
P0 = np.random.uniform(-10,10,(10,2))
P1 = np.random.uniform(-10,10,(10,2))
p = np.random.uniform(-10,10,( 1,2))
print(distance(P0, P1, p))
79. 考虑两组点集P0和P1去描述一组线(二维)和一组点集P,如何计算每一个点 j(P[j]) 到每一条线 i (P0[i],P1[i])的距离? (★★★)
# Author: Nicolas Rougier
Z = np.random.randint(0,10,(10,10))
shape = (5,5)
fill = 0
position = (1,1)
R = np.ones(shape, dtype=Z.dtype)*fill
P = np.array(list(position)).astype(int)
Rs = np.array(list(R.shape)).astype(int)
Zs = np.array(list(Z.shape)).astype(int)
R_start = np.zeros((len(shape),)).astype(int)
R_stop = np.array(list(shape)).astype(int)
Z_start = (P-Rs//2)
Z_stop = (P+Rs//2)+Rs%2
R_start = (R_start - np.minimum(Z_start,0)).tolist()
Z_start = (np.maximum(Z_start,0)).tolist()
R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist()
Z_stop = (np.minimum(Z_stop,Zs)).tolist()
r = [slice(start,stop) for start,stop in zip(R_start,R_stop)]
z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)]
R[r] = Z[z]
print(Z)
print(R)
80. 思考一个任意的数组,编写一个函数,该函数提取一个具有固定形状的子部分,并以一个给定的元素为中心(在该部分填充值) (★★★)
(提示: minimum, maximum)
# Author: Nicolas Rougier
Z = np.random.randint(0,10,(10,10))
shape = (5,5)
fill = 0
position = (1,1)
R = np.ones(shape, dtype=Z.dtype)*fill
P = np.array(list(position)).astype(int)
Rs = np.array(list(R.shape)).astype(int)
Zs = np.array(list(Z.shape)).astype(int)
R_start = np.zeros((len(shape),)).astype(int)
R_stop = np.array(list(shape)).astype(int)
Z_start = (P-Rs//2)
Z_stop = (P+Rs//2)+Rs%2
R_start = (R_start - np.minimum(Z_start,0)).tolist()
Z_start = (np.maximum(Z_start,0)).tolist()
R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist()
Z_stop = (np.minimum(Z_stop,Zs)).tolist()
r = [slice(start,stop) for start,stop in zip(R_start,R_stop)]
z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)]
R[r] = Z[z]
print(Z)
print(R)
81. 考虑一个数组Z = [1,2,3,4,5,6,7,8,9,10,11,12,13,14],如何生成一个数组R = [[1,2,3,4], [2,3,4,5], [3,4,5,6], …,[11,12,13,14]]? (★★★)
(提示: stride_tricks.as_strided)
# Author: Stefan van der Walt
Z = np.arange(1,15,dtype=np.uint32)
R = stride_tricks.as_strided(Z,(11,4),(4,4))
print(R)
82. 计算矩阵的秩 (★★★)
(提示: np.linalg.svd)
# Author: Stefan van der Walt
Z = np.random.uniform(0,1,(10,10))
U, S, V = np.linalg.svd(Z) # Singular Value Decomposition
rank = np.sum(S > 1e-10)
print(rank)
83. 如何找出数组中出现频率最高的值?(★★★)
(提示: np.bincount, argmax)
Z = np.random.randint(0,10,50)
print(np.bincount(Z).argmax())
84. 从一个10x10的矩阵中提取出连续的3x3区块**(★★★)
(提示: stride_tricks.as_strided)
# Author: Chris Barker
Z = np.random.randint(0,5,(10,10))
n = 3
i = 1 + (Z.shape[0]-3)
j = 1 + (Z.shape[1]-3)
C = stride_tricks.as_strided(Z, shape=(i, j, n, n), strides=Z.strides + Z.strides)
print(C)
85.创建一个满足 Z[i,j] == Z[j,i]的二维数组子类 (★★★)
(提示: class method)
# Author: Eric O. Lebigot
# Note: only works for 2d array and value setting using indices
class Symetric(np.ndarray):
def __setitem__(self, index, value):
i,j = index
super(Symetric, self).__setitem__((i,j), value)
super(Symetric, self).__setitem__((j,i), value)
def symetric(Z):
return np.asarray(Z + Z.T - np.diag(Z.diagonal())).view(Symetric)
S = symetric(np.random.randint(0,10,(5,5)))
S[2,3] = 42
print(S)
86. 考虑p个 nxn 矩阵和一组形状为(n,1)的向量,如何直接计算p个矩阵的乘积(n,1)? (★★★)
(提示: np.tensordot)
# Author: Stefan van der Walt
p, n = 10, 20
M = np.ones((p,n,n))
V = np.ones((p,n,1))
S = np.tensordot(M, V, axes=[[0, 2], [0, 1]])
print(S)
# It works, because:
# M is (p,n,n)
# V is (p,n,1)
# Thus, summing over the paired axes 0 and 0 (of M and V independently),
# and 2 and 1, to remain with a (n,1) vector.
87. 对于一个16x16的数组,如何得到一个区域的和(区域大小为4x4)? (★★★)
(提示: np.add.reduceat)
# Author: Robert Kern
Z = np.ones((16,16))
k = 4
S = np.add.reduceat(np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0), np.arange(0, Z.shape[1], k), axis=1)
print(S)
88. 如何利用numpy数组实现Game of Life? (★★★)
(提示: Game of Life , Game of Life有哪些图形?)
# Author: Nicolas Rougier
def iterate(Z):
# Count neighbours
N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] +
Z[1:-1,0:-2] + Z[1:-1,2:] +
Z[2: ,0:-2] + Z[2: ,1:-1] + Z[2: ,2:])
# Apply rules
birth = (N==3) & (Z[1:-1,1:-1]==0)
survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1)
Z[...] = 0
Z[1:-1,1:-1][birth | survive] = 1
return Z
Z = np.random.randint(0,2,(50,50))
for i in range(100): Z = iterate(Z)
print(Z)
89. 如何找到一个数组的第n个最大值?** (★★★)
(提示: np.argsort | np.argpartition)
Z = np.arange(10000)
np.random.shuffle(Z)
n = 5
# Slow
print (Z[np.argsort(Z)[-n:]])
# Fast
print (Z[np.argpartition(-Z,n)[:n]])
90. 给定任意个数向量,创建笛卡尔积(每一个元素的每一种组合) (★★★)
(提示: np.indices)
# Author: Stefan Van der Walt
def cartesian(arrays):
arrays = [np.asarray(a) for a in arrays]
shape = (len(x) for x in arrays)
ix = np.indices(shape, dtype=int)
ix = ix.reshape(len(arrays), -1).T
for n, arr in enumerate(arrays):
ix[:, n] = arrays[n][ix[:, n]]
return ix
print (cartesian(([1, 2, 3], [4, 5], [6, 7])))
91. 如何从一个常规数组中创建记录数组(record array)? (★★★)
(提示: np.core.records.fromarrays)
Z = np.array([("Hello", 2.5, 3),
("World", 3.6, 2)])
R = np.core.records.fromarrays(Z.T,
names='col1, col2, col3',
formats = 'S8, f8, i8')
print(R)
92. 思考一个大向量Z, 用三种不同的方法计算它的立方 (★★★)
(提示: np.power, *, np.einsum)
# Author: Ryan G.
x = np.random.rand(5e7)
%timeit np.power(x,3)
%timeit x*x*x
%timeit np.einsum('i,i,i->i',x,x,x)
93. 考虑两个形状分别为(8,3) 和(2,2)的数组A和B. 如何在数组A中找到满足包含B中元素的行?(不考虑B中每行元素顺序)? (★★★)
(提示: np.where)
# Author: Gabe Schwartz
A = np.random.randint(0,5,(8,3))
B = np.random.randint(0,5,(2,2))
C = (A[..., np.newaxis, np.newaxis] == B)
rows = np.where(C.any((3,1)).all(1))[0]
print(rows)
94. 思考一个10x3的矩阵,如何分解出有不全相同值的行 (如 [2,2,3])(★★★)
# Author: Robert Kern
Z = np.random.randint(0,5,(10,3))
print(Z)
# solution for arrays of all dtypes (including string arrays and record arrays)
E = np.all(Z[:,1:] == Z[:,:-1], axis=1)
U = Z[~E]
print(U)
# soluiton for numerical arrays only, will work for any number of columns in Z
U = Z[Z.max(axis=1) != Z.min(axis=1),:]
print(U)
95. 将一个整数向量转换为二进制矩阵 (★★★)
(提示: np.unpackbits)
# Author: Warren Weckesser
I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128])
B = ((I.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int)
print(B[:,::-1])
# Author: Daniel T. McDonald
I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8)
print(np.unpackbits(I[:, np.newaxis], axis=1))
96. 给定一个二维数组,如何提取出唯一的行?(★★★)
(提示: np.ascontiguousarray)
# Author: Jaime Fernández del Río
Z = np.random.randint(0,2,(6,3))
T = np.ascontiguousarray(Z).view(np.dtype((np.void, Z.dtype.itemsize * Z.shape[1])))
_, idx = np.unique(T, return_index=True)
uZ = Z[idx]
print(uZ)
97. 考虑两个向量A和B,写出用einsum等式对应的inner, outer, sum, mul函数 (★★★)
(提示: np.einsum)
# Author: Alex Riley
# Make sure to read: http://ajcr.net/Basic-guide-to-einsum/
A = np.random.uniform(0,1,10)
B = np.random.uniform(0,1,10)
np.einsum('i->', A) # np.sum(A)
np.einsum('i,i->i', A, B) # A * B
np.einsum('i,i', A, B) # np.inner(A, B)
np.einsum('i,j->ij', A, B) # np.outer(A, B)
98. 考虑一个由两个向量描述的路径(X,Y),如何用等距样例(equidistant samples)对其进行采样(sample)(★★★)?
(提示: np.cumsum, np.interp)
# Author: Bas Swinckels
phi = np.arange(0, 10*np.pi, 0.1)
a = 1
x = a*phi*np.cos(phi)
y = a*phi*np.sin(phi)
dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths
r = np.zeros_like(x)
r[1:] = np.cumsum(dr) # integrate path
r_int = np.linspace(0, r.max(), 200) # regular spaced path
x_int = np.interp(r_int, r, x) # integrate path
y_int = np.interp(r_int, r, y)
99. 给定一个整数n 和一个二维数组X,从X中选择可以被解释为从多n度的多项分布式的行,即这些行只包含整数对n的和. (★★★)
(提示: np.logical_and.reduce, np.mod)
# Author: Evgeni Burovski
X = np.asarray([[1.0, 0.0, 3.0, 8.0],
[2.0, 0.0, 1.0, 1.0],
[1.5, 2.5, 1.0, 0.0]])
n = 4
M = np.logical_and.reduce(np.mod(X, 1) == 0, axis=-1)
M &= (X.sum(axis=-1) == n)
print(X[M])
100. 对于一个一维数组X,计算它boostrapped之后的95%置信区间的平均值. (★★★)
(提示: np.percentile)
# Author: Jessica B. Hamrick
X = np.random.randn(100) # random 1D array
N = 1000 # number of bootstrap samples
idx = np.random.randint(0, X.size, (N, X.size))
means = X[idx].mean(axis=1)
confint = np.percentile(means, [2.5, 97.5])
print(confint)