编程手养成计划 Day11-15

NumPy 100道练习题

本来是打算把这一百道题搞完,做到几十道发现绝大多数题都要学习新函数,本来是把函数作用和参数写到文章的,后来发现太多了就想着后面搞一个函数汇总吧。毕竟写这个的初衷是方便我以后看,但是现在发现好像不是很方便了,所以后面就没写函数了。
另外就是一直跟这玩意死磕到底实在是太浪费时间了,所以以后有时间会把这个在做一下补充吧大概。


目录

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=xiyj1)(★★☆)

# 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值