2025年python自定义函数实例计算1-n的偶偶数和_day1-numpy练习

python自定义函数实例计算1-n的偶偶数和_day1-numpy练习这是在 numpy 邮件列表 stackoverflo 和 numpy 文档中收集的练习集合 该系列的目标是为新老用户提供快速参考 同时为教学人员提供一系列练习 如果您发现错误或认为您有更好的方法来解决其中一些错误 请随时在 https github com rougier numpy 100 上打开一个 issue 1

大家好,我是讯享网,很高兴认识大家。

这是在numpy邮件列表,stackoverflow和numpy文档中收集的练习集合。 该系列的目标是为新老用户提供快速参考,同时为教学人员提供一系列练习。

如果您发现错误或认为您有更好的方法来解决其中一些错误,请随时在https://github.com/rougier/numpy-100上打开一个issue

1. 以np为别名导入numpy包 (★☆☆)

import numpy as np

2. 打印numpy版本和配置 (★☆☆)

print(np.__version__)

np.show_config()

1.14.3

mkl_info:

libraries = ['mkl_rt', 'pthread']

library_dirs = ['/Users/iosdevlog/anaconda3/lib']

define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]

include_dirs = ['/Users/iosdevlog/anaconda3/include']

blas_mkl_info:

libraries = ['mkl_rt', 'pthread']

library_dirs = ['/Users/iosdevlog/anaconda3/lib']

define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]

include_dirs = ['/Users/iosdevlog/anaconda3/include']

blas_opt_info:

libraries = ['mkl_rt', 'pthread']

library_dirs = ['/Users/iosdevlog/anaconda3/lib']

define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]

include_dirs = ['/Users/iosdevlog/anaconda3/include']

lapack_mkl_info:

libraries = ['mkl_rt', 'pthread']

library_dirs = ['/Users/iosdevlog/anaconda3/lib']

define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]

include_dirs = ['/Users/iosdevlog/anaconda3/include']

lapack_opt_info:

libraries = ['mkl_rt', 'pthread']

library_dirs = ['/Users/iosdevlog/anaconda3/lib']

define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]

include_dirs = ['/Users/iosdevlog/anaconda3/include']

3. 创建一个大小为10的空向量 (★☆☆)

Z = np.zeros(10)

print(Z)

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

4. 如何查找数组的内存大小 (★☆☆)

Z = np.zeros((10,10))

print("%d bytes" % (Z.size * Z.itemsize))

800 bytes

5. 如何从命令行获取numpy add函数的文档? (★☆☆)

%run `python -c "import numpy; numpy.info(numpy.add)"`

ERROR:root:File `'`python.py'` not found.

6. 创建大小为10的空向量,但第五个值为1 (★☆☆)

Z = np.zeros(10)

Z[4] = 1

print(Z)

[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]

7. 创建一个值为10到49的向量 (★☆☆)

Z = np.arange(10,50)

print(Z)

[10 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49]

8. 反转向量(第一个元素成为最后一个) (★☆☆)

Z = np.arange(50)

Z = Z[::-1]

print(Z)

[49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26

25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2

1 0]

9. 创建一个3x3矩阵,其值范围为0到8 (★☆☆)

Z = np.arange(9).reshape(3,3)

print(Z)

[[0 1 2]

[3 4 5]

[6 7 8]]

10.从 [1,2,0,0,4,0] 中查找非零元素的索引 (★☆☆)

nz = np.nonzero([1,2,0,0,4,0])

print(nz)

(array([0, 1, 4]),)

11. 创建3x3单位矩阵 (★☆☆)

Z = np.eye(3)

print(Z)

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]

12. 使用随机值创建3x3x3数组 (★☆☆)

Z = np.random.random((3,3,3))

print(Z)

[[[0. 0. 0.]

[0. 0. 0.]

[0.0 0. 0. ]]

[[0. 0. 0.]

[0. 0.00 0.]

[0. 0. 0.]]

[[0. 0. 0.]

[0. 0. 0.]

[0. 0. 0.]]]

13. 创建具有随机值的10x10数组,并查找最小值和最大值 (★☆☆)

Z = np.random.random((10,10))

Zmin, Zmax = Z.min(), Z.max()

print(Zmin, Zmax)

0.0055354 0.58699

14. 创建一个大小为30的随机向量并找到平均值 (★☆☆)

Z = np.random.random(30)

m = Z.mean()

print(m)

0.

15. 创建一个2d数组,边框为1,内部为0 (★☆☆)

Z = np.ones((10,10))

Z[1:-1,1:-1] = 0

print(Z)

[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]

16. 如何在现有数组周围添加边框(填充0)? (★☆☆)

Z = np.ones((5,5))

Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)

print(Z)

[[0. 0. 0. 0. 0. 0. 0.]

[0. 1. 1. 1. 1. 1. 0.]

[0. 1. 1. 1. 1. 1. 0.]

[0. 1. 1. 1. 1. 1. 0.]

[0. 1. 1. 1. 1. 1. 0.]

[0. 1. 1. 1. 1. 1. 0.]

[0. 0. 0. 0. 0. 0. 0.]]

17. 以下表达式的结果是什么? (★☆☆)

print(0 * np.nan)

print(np.nan == np.nan)

print(np.inf > np.nan)

print(np.nan - np.nan)

print(0.3 == 3 * 0.1)

nan

False

False

nan

False

18. 在对角线下方创建一个值为1,2,3,4的5x5矩阵 (★☆☆)

Z = np.diag(1+np.arange(4),k=-1)

print(Z)

[[0 0 0 0 0]

[1 0 0 0 0]

[0 2 0 0 0]

[0 0 3 0 0]

[0 0 0 4 0]]

19. 创建一个8x8矩阵并用棋盘图案填充它 (★☆☆)

Z = np.zeros((8,8),dtype=int)

Z[1::2,::2] = 1

Z[::2,1::2] = 1

print(Z)

[[0 1 0 1 0 1 0 1]

[1 0 1 0 1 0 1 0]

[0 1 0 1 0 1 0 1]

[1 0 1 0 1 0 1 0]

[0 1 0 1 0 1 0 1]

[1 0 1 0 1 0 1 0]

[0 1 0 1 0 1 0 1]

[1 0 1 0 1 0 1 0]]

20. 考虑一个(6,7,8)形状数组,第100个元素的索引(x,y,z)是什么?

print(np.unravel_index(100,(6,7,8)))

(1, 5, 4)

21. 使用tile函数创建棋盘格8x8矩阵 (★☆☆)

Z = np.tile( np.array([[0,1],[1,0]]), (4,4))

print(Z)

[[0 1 0 1 0 1 0 1]

[1 0 1 0 1 0 1 0]

[0 1 0 1 0 1 0 1]

[1 0 1 0 1 0 1 0]

[0 1 0 1 0 1 0 1]

[1 0 1 0 1 0 1 0]

[0 1 0 1 0 1 0 1]

[1 0 1 0 1 0 1 0]]

22. 归一化5x5随机矩阵 (★☆☆)

Z = np.random.random((5,5))

Zmax, Zmin = Z.max(), Z.min()

Z = (Z - Zmin)/(Zmax - Zmin)

print(Z)

[[0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0.0]

[0. 0. 0. 0. 0.]

[1. 0.0 0. 0. 0.]]

23. 创建一个自定义dtype,将颜色描述为四个无符号字节(RGBA) (★☆☆)

color = np.dtype([("r", np.ubyte, 1),

("g", np.ubyte, 1),

("b", np.ubyte, 1),

("a", np.ubyte, 1)])

24. 将5x3矩阵乘以3x2矩阵(实矩阵乘积) (★☆☆)

Z = np.dot(np.ones((5,3)), np.ones((3,2)))

print(Z)

# Alternative solution, in Python 3.5 and above

Z = np.ones((5,3)) @ np.ones((3,2))

[[3. 3.]

[3. 3.]

[3. 3.]

[3. 3.]

[3. 3.]]

25. 给定一维数组,否定所有在3到8之间的元素。(★☆☆)

# Author: Evgeni Burovski

Z = np.arange(11)

Z[(3 < Z) & (Z <= 8)] *= -1

print(Z)

[ 0 1 2 3 -4 -5 -6 -7 -8 9 10]

26. 以下脚本的输出是什么? (★☆☆)

# Author: Jake VanderPlas

print(sum(range(5),-1))

from numpy import *

print(sum(range(5),-1))

9

10

27. 考虑整数向量Z,这些表达式中哪些是合法的? (★☆☆)

Z = np.zeros(10)

ZZ

# 2 << Z >> 2 TypeError: ufunc 'left_shift' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Z Z ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

28. 以下表达式的结果是什么?

print(np.array(0) / np.array(0))

print(np.array(0) // np.array(0))

print(np.array([np.nan]).astype(int).astype(float))

nan

0

[-9.e+18]

/Users/iosdevlog/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in true_divide

"""Entry point for launching an IPython kernel.

/Users/iosdevlog/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:2: RuntimeWarning: divide by zero encountered in floor_divide

29. 如何从零浮点数舍入? (★☆☆)

# Author: Charles R Harris

Z = np.random.uniform(-10,+10,10)

print (np.copysign(np.ceil(np.abs(Z)), Z))

[10. -8. 2. 7. 10. -1. -6. -3. -5. 5.]

30. 如何在两个数组之间找到常用值? (★☆☆)

Z1 = np.random.randint(0,10,10)

Z2 = np.random.randint(0,10,10)

print(np.intersect1d(Z1,Z2))

[2 4 6 7 8]

31. 如何忽略所有numpy警告(不推荐)? (★☆☆)

# Suicide mode on

defaults = np.seterr(all="ignore")

Z = np.ones(1) / 0

# Back to sanity

_ = np.seterr(defaults)

# An equivalent way, with a context manager:

with np.errstate(divide='ignore'):

Z = np.ones(1) / 0

32. 以下表达式是 true 吗?(★☆☆)

np.sqrt(-1) == np.emath.sqrt(-1)

/Users/iosdevlog/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in sqrt

"""Entry point for launching an IPython kernel.

False

33. 如何获取昨天,今天和明天的日期? (★☆☆)

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月相对应的所有日期? (★★☆)

Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]')

print(Z)

['2016-07-01' '2016-07-02' '2016-07-03' '2016-07-04' '2016-07-05'

'2016-07-06' '2016-07-07' '2016-07-08' '2016-07-09' '2016-07-10'

'2016-07-11' '2016-07-12' '2016-07-13' '2016-07-14' '2016-07-15'

'2016-07-16' '2016-07-17' '2016-07-18' '2016-07-19' '2016-07-20'

'2016-07-21' '2016-07-22' '2016-07-23' '2016-07-24' '2016-07-25'

'2016-07-26' '2016-07-27' '2016-07-28' '2016-07-29' '2016-07-30'

'2016-07-31']

35. 如何计算((A+B)*(-A/2)) (不copy)?(★★☆)

A = np.ones(3)*1

B = np.ones(3)*2

C = np.ones(3)*3

np.add(A,B,out=B)

np.divide(A,2,out=A)

np.negative(A,out=A)

np.multiply(A,B,out=A)

array([-1.5, -1.5, -1.5])

36. 使用5种不同的方法提取随机数组的整数部分 (★★☆)

Z = np.random.uniform(0,10,10)

print (Z - Z%1)

print (np.floor(Z))

print (np.ceil(Z)-1)

print (Z.astype(int))

print (np.trunc(Z))

[2. 0. 0. 3. 9. 8. 8. 4. 8. 6.]

[2. 0. 0. 3. 9. 8. 8. 4. 8. 6.]

[2. 0. 0. 3. 9. 8. 8. 4. 8. 6.]

[2 0 0 3 9 8 8 4 8 6]

[2. 0. 0. 3. 9. 8. 8. 4. 8. 6.]

37. 创建一个5x5矩阵,行值范围为0到4 (★★☆)

Z = np.zeros((5,5))

Z += np.arange(5)

print(Z)

[[0. 1. 2. 3. 4.]

[0. 1. 2. 3. 4.]

[0. 1. 2. 3. 4.]

[0. 1. 2. 3. 4.]

[0. 1. 2. 3. 4.]]

38. 考虑生成10个整数并使用它来构建数组的生成器函数(★☆☆)

def generate():

for x in range(10):

yield x

Z = np.fromiter(generate(),dtype=float,count=-1)

print(Z)

[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]

39. 创建一个大小为10的向量,其值范围为0到1,两者都被排除(★★☆)

Z = np.linspace(0,1,11,endpoint=False)[1:]

print(Z)

[0.0 0. 0. 0. 0. 0.

0. 0. 0. 0.]

40. 创建一个大小为10的随机向量并对其进行排序(★★☆)

Z = np.random.random(10)

Z.sort()

print(Z)

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

41. 如何比np.sum更快地求和一个小数组? (★★☆)

# Author: Evgeni Burovski

Z = np.arange(10)

np.add.reduce(Z)

45

42. 考虑两个随机数组A和B,检查它们是否相等(★★☆)

A = np.random.randint(0,2,5)

B = np.random.randint(0,2,5)

# Assuming identical shape of the arrays and a tolerance for the comparison of values

equal = np.allclose(A,B)

print(equal)

# Checking both the shape and the element values, no tolerance (values have to be exactly equal)

equal = np.array_equal(A,B)

print(equal)

False

False

43. 使数组不可变(只读) (★★☆)

Z = np.zeros(10)

Z.flags.writeable = False

# Z[0] = 1 ValueError: assignment destination is read-only

44. 考虑一个代表笛卡尔坐标的随机10x2矩阵,将它们转换为极坐标 (★★☆)

Z = np.random.random((10,2))

X,Y = Z[:,0], Z[:,1]

R = np.sqrt(X2+Y2)

T = np.arctan2(Y,X)

print(R)

print(T)

[0. 0. 0. 0. 0. 0.

1. 0. 0. 0.]

[1. 0. 0. 0. 1. 1.

0. 0. 1.0 0. ]

45. 创建大小为10的随机向量,并将最大值替换为0 (★★☆)

Z = np.random.random(10)

Z[Z.argmax()] = 0

print(Z)

[0. 0. 0.0044212 0. 0. 0.

0.00 0. 0. 0.]

46. 创建一个带有x和y坐标的结构化数组,覆盖 [0,1]x[0,1] 区域(★★☆)

Z = np.zeros((5,5), [('x',float),('y',float)])

Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5),

np.linspace(0,1,5))

print(Z)

[[(0. , 0. ) (0.25, 0. ) (0.5 , 0. ) (0.75, 0. ) (1. , 0. )]

[(0. , 0.25) (0.25, 0.25) (0.5 , 0.25) (0.75, 0.25) (1. , 0.25)]

[(0. , 0.5 ) (0.25, 0.5 ) (0.5 , 0.5 ) (0.75, 0.5 ) (1. , 0.5 )]

[(0. , 0.75) (0.25, 0.75) (0.5 , 0.75) (0.75, 0.75) (1. , 0.75)]

[(0. , 1. ) (0.25, 1. ) (0.5 , 1. ) (0.75, 1. ) (1. , 1. )]]

47. 给定两个数组X和Y,构造Cauchy矩阵C (Cij =1/(xi - yj))

# Author: Evgeni Burovski

X = np.arange(8)

Y = X + 0.5

C = 1.0 / np.subtract.outer(X, Y)

print(np.linalg.det(C))

3638.66

48. 打印每个numpy标量类型的最小和最大可表示值 (★★☆)

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)

-128

127

-

-

-3.e+38

3.e+38

1.e-07

-1.23157e+308

1.23157e+308

2.0313e-16

49. 如何打印数组的所有值? (★★☆)

np.set_printoptions(threshold=np.nan)

Z = np.zeros((16,16))

print(Z)

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

50. 如何在向量中找到最接近的值(给定标量)? (★★☆)

Z = np.arange(100)

v = np.random.uniform(0,100)

index = (np.abs(Z-v)).argmin()

print(Z[index])

21

51. 创建表示位置(x,y)和颜色(r,g,b)的结构化数组 (★★☆)

Z = np.zeros(10, [ ('position', [ ('x', float, 1),

('y', float, 1)]),

('color', [ ('r', float, 1),

('g', float, 1),

('b', float, 1)])])

print(Z)

[((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))

((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))

((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))

((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))

((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))]

52. 考虑一个随机向量,其形状(100,2)代表坐标,逐点找到 (★★☆)

Z = np.random.random((10,2))

X,Y = np.atleast_2d(Z[:,0], Z[:,1])

D = np.sqrt( (X-X.T)2 + (Y-Y.T)2)

print(D)

# Much faster with scipy

import scipy

# Thanks Gavin Heverly-Coulson (#issue 1)

import scipy.spatial

Z = np.random.random((10,2))

D = scipy.spatial.distance.cdist(Z,Z)

print(D)

[[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0.0 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.0

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0. ]]

[[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0. ]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.0]

[0. 0. 0. 0. 0. 0.

0. 0. 1.0 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 1.0

0. 0. 0. 0.]

[0. 0. 0. 0. 0.0 0.

0. 0. 0. 0. ]]

53. 如何将float(32位)数组转换为整数(32位)?

Z = np.arange(10, dtype=np.float32)

Z = Z.astype(np.int32, copy=False)

print(Z)

[0 1 2 3 4 5 6 7 8 9]

54. 如何阅读以下文件? (★★☆)

from io import StringIO

# Fake file

s = StringIO("""1, 2, 3, 4, 5\n

6, , , 7, 8\n

, , 9,10,11\n""")

Z = np.genfromtxt(s, delimiter=",", dtype=np.int)

print(Z)

[[ 1 2 3 4 5]

[ 6 -1 -1 7 8]

[-1 -1 9 10 11]]

55. numpy数组的枚举相当于什么? (★★☆)

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])

(0, 0) 0

(0, 1) 1

(0, 2) 2

(1, 0) 3

(1, 1) 4

(1, 2) 5

(2, 0) 6

(2, 1) 7

(2, 2) 8

(0, 0) 0

(0, 1) 1

(0, 2) 2

(1, 0) 3

(1, 1) 4

(1, 2) 5

(2, 0) 6

(2, 1) 7

(2, 2) 8

56. 生成通用的2D高斯类数组 (★★☆)

X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10))

D = np.sqrt(X*X+Y*Y)

sigma, mu = 1.0, 0.0

G = np.exp(-( (D-mu)2 / ( 2.0 * sigma2 ) ) )

print(G)

[[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]]

57. 如何将p元素随机放置在2D数组中? (★★☆)

# 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)

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]

[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

58. 减去矩阵每行的平均值 (★★☆)

# Author: Warren Weckesser

X = np.random.rand(5, 10)

# Recent versions of numpy

Y = X - X.mean(axis=1, keepdims=True)

# Older versions of numpy

Y = X - X.mean(axis=1).reshape(-1, 1)

print(Y)

[[-0.0 0. 0. 0. 0. -0.

0. 0. -0. -0.]

[ 0.0 -0. -0. -0. 0. -0.

-0. 0. 0. 0.]

[ 0. 0. -0. -0. 0.0 0.0

-0. 0. 0. -0.0]

[ 0. 0. -0. 0.0 0. -0.0

0. -0. -0. 0.]

[-0. -0. 0. -0. -0.0 0.

0. 0. 0. -0.]]

59. 如何按第n列对数组进行排序? (★★☆)

# Author: Steve Tjoa

Z = np.random.randint(0,10,(3,3))

print(Z)

print(Z[Z[:,1].argsort()])

[[7 9 1]

[4 9 9]

[1 7 6]]

[[1 7 6]

[7 9 1]

[4 9 9]]

60. 如何判断给定的2D数组是否具有空列?(★★☆)

# Author: Warren Weckesser

Z = np.random.randint(0,3,(3,10))

print((~Z.any(axis=0)).any())

False

61. 从数组中的给定值中查找最接近的值 (★★☆)

Z = np.random.uniform(0,1,10)

z = 0.5

m = Z.flat[np.abs(Z - z).argmin()]

print(m)

0.37276

62. 考虑两个形状为(1,3)和(3,1)的数组,如何使用迭代器计算它们的总和? (★★☆)

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])

[[0 1 2]

[1 2 3]

[2 3 4]]

63. 创建一个具有name属性的数组类 (★★☆)

class NamedArray(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)

range_10

64. 考虑一个给定的向量,如何为每个由第二个向量索引的元素添加1(小心重复索引)? (★★★)

# 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)

[4. 1. 2. 5. 3. 2. 4. 3. 4. 2.]

[7. 1. 3. 9. 5. 3. 7. 5. 7. 3.]

65. 如何基于索引列表(I)将向量(X)的元素累积到数组(F)? (★★★)

# 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)

[0. 7. 0. 6. 5. 0. 0. 0. 0. 3.]

66. 考虑(dtype = ubyte)的(w,h,3)图像,计算唯一颜色的数量 (★★★)

# Author: Nadav Horesh

w,h = 16,16

I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)

#Note that we should compute 256*256 first.

#Otherwise numpy will only promote F.dtype to 'uint16' and overfolw will occur

F = I[...,0]*(256*256) + I[...,1]*256 +I[...,2]

n = len(np.unique(F))

print(n)

8

67. 考虑四维数组,如何一次得到最后两个轴的总和? (★★★)

A = np.random.randint(0,10,(3,4,3,4))

# solution by passing a tuple of axes (introduced in numpy 1.7.0)

sum = A.sum(axis=(-2,-1))

print(sum)

# solution by flattening the last two dimensions into one

# (useful for functions that don't accept tuples for axis argument)

sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1)

print(sum)

[[72 80 48 56]

[51 63 65 54]

[46 67 54 43]]

[[72 80 48 56]

[51 63 65 54]

[46 67 54 43]]

68. 考虑一维向量D,如何使用描述子集索引的相同大小的向量S来计算D的子集的均值? (★★★)

# 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())

[0. 0. 0. 0. 0. 0.

0. 0. 0. 0.]

0 0.

1 0.

2 0.

3 0.

4 0.

5 0.

6 0.

7 0.

8 0.

9 0.

dtype: float64

69. 如何获得点积的对角线? (★★★)

# 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)

array([1., 1., 1.0, 1., 1.])

70. 考虑向量 [1,2,3,4,5],如何构建一个新的向量,在每个值之间插入3个连续的零? (★★★)

# 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)

[1. 0. 0. 0. 2. 0. 0. 0. 3. 0. 0. 0. 4. 0. 0. 0. 5.]

71. 考虑一个维度数组(5,5,3),如何将它乘以一个维数为(5,5)的数组?(★★★)

A = np.ones((5,5,3))

B = 2*np.ones((5,5))

print(A * B[:,:,None])

[[[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]]

[[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]]

[[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]]

[[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]]

[[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]

[2. 2. 2.]]]

72. 如何交换数组的两行? (★★★)

# Author: Eelco Hoogendoorn

A = np.arange(25).reshape(5,5)

A[[0,1]] = A[[1,0]]

print(A)

[[ 5 6 7 8 9]

[ 0 1 2 3 4]

[10 11 12 13 14]

[15 16 17 18 19]

[20 21 22 23 24]]

73. 考虑一组描述10个三角形(具有共享顶点)的10个三元组,找到组成所有三角形的唯一线段的集合 (★★★)

# 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)

[( 0, 70) ( 0, 91) ( 3, 29) ( 3, 53) ( 3, 90) ( 3, 98) (24, 55) (24, 64)

(27, 63) (27, 85) (29, 35) (29, 40) (29, 90) (35, 40) (35, 52) (35, 74)

(38, 42) (38, 81) (42, 81) (52, 74) (53, 56) (53, 62) (53, 67) (53, 92)

(53, 98) (55, 64) (56, 67) (62, 92) (63, 85) (70, 91)]

74. 给定一个bincount的数组C,如何生成一个数组A,使得 np.bincount(A) == C? (★★★)

# 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)

[1 1 2 3 4 4 6]

75. 如何使用数组上的滑动窗口计算平均值? (★★★)

# 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))

[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.]

76. 考虑一维数组Z,构建一个二维数组,其第一行为(Z[0],Z[1],Z[2]),每个后续行移1 行 (最后一行应该是Z[-3],Z[-2],Z[-1]) (★★★)

# 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)

[[0 1 2]

[1 2 3]

[2 3 4]

[3 4 5]

[4 5 6]

[5 6 7]

[6 7 8]

[7 8 9]]

77. 如何否定布尔值,或改变浮点数的符号? (★★★)

# 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)

array([ 5.e-01, 8.e-01, -4.e-01, 2.e-01,

6.e-01, -1.e-01, -4.e-04, 9.e-01,

-7.e-01, 3.e-01, 5.e-02, 5.0e-01,

-1.e-01, 2.e-01, 4.e-01, 9.e-01,

9.e-01, 8.e-01, -8.e-01, -8.e-01,

-1.e-01, 9.e-01, 6.e-01, -2.0e-01,

-1.e-01, -5.e-01, -9.e-01, -6.e-01,

6.e-01, -7.0e-01, 7.e-01, -3.e-01,

-1.0e-01, -4.e-01, 3.e-01, 1.0e-02,

1.0e-01, -6.e-01, 7.e-01, 7.0e-01,

6.e-01, 2.e-01, -4.e-01, 2.e-01,

7.e-01, -5.e-01, -2.e-01, 7.e-02,

-3.e-01, 2.e-01, 2.e-01, -2.e-01,

5.e-01, -5.e-01, -2.0e-01, 9.e-01,

8.00e-01, -3.e-01, -1.e-01, -2.e-01,

-3.e-01, 5.e-01, -6.e-01, -1.e-01,

-7.e-01, 5.e-01, 6.e-01, -4.e-02,

-5.e-01, -3.e-01, 2.e-02, -1.e-01,

2.e-02, -9.e-01, -3.e-01, -2.e-01,

-9.e-01, 2.e-01, 9.e-01, 5.e-01,

1.e-01, -3.e-01, 7.e-01, -5.e-02,

1.e-01, -9.e-02, 1.e-02, 3.e-01,

-2.e-01, 3.e-01, -4.e-01, 3.0e-01,

4.e-01, 3.e-01, 3.e-01, -1.e-01,

-8.e-01, -5.e-01, 7.e-01, 7.e-01])

78. 考虑2组点P0,P1描述线(2d)和点p,如何计算从p到每条线的距离i (P0[i],P1[i])? (★★★)

def distance(P0, P1, p):

T = P1 - P0

L = (T2).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((D2).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))

[ 6. 4. 6. 0.0 11. 10.

6. 2. 13. 12. ]

79. 考虑2组点P0,P1描述线(2d)和一组点P,如何计算从每个点j (P[j])到每条线的距离i (P0[i],P1[i])? (★★★)

# Author: Italmassov Kuanysh

# based on distance function from previous question

P0 = np.random.uniform(-10, 10, (10,2))

P1 = np.random.uniform(-10,10,(10,2))

p = np.random.uniform(-10, 10, (10,2))

print(np.array([distance(P0,P1,p_i) for p_i in p]))

[[ 0. 5. 3. 2.00 14. 5.

14. 9. 1. 8. ]

[ 9. 1. 4. 4. 5. 1.

5. 3. 7. 10.]

[ 0. 7. 0. 3. 15. 3.

14. 7. 1. 6.]

[14. 3. 0. 5. 1. 6.

0. 4. 13. 5.]

[ 7. 2. 10. 6. 7. 7.

8. 9. 3.0 15. ]

[ 4. 1. 5. 1. 11.0 4.

10. 8.0 1. 10.]

[18. 10.0 7. 12. 2. 1.

3. 0. 15. 13.]

[ 0. 11. 8.0 8. 16. 5.

14.00 0.0 1. 2.]

[ 1. 4. 3. 1. 13. 5.0

13. 8. 0. 9.]

[11. 2. 3.0 5. 4. 1.

3. 1.0 9. 8.]]

80. 考虑一个任意数组,编写一个函数,提取具有固定形状的子部分并以给定元素为中心(必要时使用“fill”值填充) (★★★)

# 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)

[[8 3 9 2 0 9 1 1 1 4]

[9 3 2 2 1 3 8 7 1 9]

[1 5 6 6 3 5 0 9 5 5]

[3 6 4 9 7 8 6 1 6 5]

[7 9 3 9 9 1 8 9 6 9]

[9 0 3 0 7 4 9 7 2 9]

[8 1 9 9 8 9 2 9 9 0]

[2 5 4 4 7 1 0 0 1 1]

[9 9 0 4 8 2 3 4 1 1]

[3 5 6 4 5 2 7 5 1 0]]

[[0 0 0 0 0]

[0 8 3 9 2]

[0 9 3 2 2]

[0 1 5 6 6]

[0 3 6 4 9]]

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]]?

# 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)

[[ 1 2 3 4]

[ 2 3 4 5]

[ 3 4 5 6]

[ 4 5 6 7]

[ 5 6 7 8]

[ 6 7 8 9]

[ 7 8 9 10]

[ 8 9 10 11]

[ 9 10 11 12]

[10 11 12 13]

[11 12 13 14]]

82. 计算矩阵排名(★★★)

# 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)

10

83. 如何在数组中找到最常见的值?

Z = np.random.randint(0,10,50)

print(np.bincount(Z).argmax())

8

84. 从随机10x10矩阵中提取所有连续的3x3块(★★★)

# 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)

[[[[2 2 2]

[0 4 0]

[3 4 3]]

[[2 2 0]

[4 0 2]

[4 3 4]]

[[2 0 4]

[0 2 2]

[3 4 0]]

[[0 4 1]

[2 2 4]

[4 0 1]]

[[4 1 2]

[2 4 0]

[0 1 2]]

[[1 2 3]

[4 0 1]

[1 2 1]]

[[2 3 3]

[0 1 4]

[2 1 1]]

[[3 3 2]

[1 4 1]

[1 1 4]]]

[[[0 4 0]

[3 4 3]

[3 4 0]]

[[4 0 2]

[4 3 4]

[4 0 0]]

[[0 2 2]

[3 4 0]

[0 0 3]]

[[2 2 4]

[4 0 1]

[0 3 0]]

[[2 4 0]

[0 1 2]

[3 0 3]]

[[4 0 1]

[1 2 1]

[0 3 4]]

[[0 1 4]

[2 1 1]

[3 4 3]]

[[1 4 1]

[1 1 4]

[4 3 0]]]

[[[3 4 3]

[3 4 0]

[2 4 1]]

[[4 3 4]

[4 0 0]

[4 1 2]]

[[3 4 0]

[0 0 3]

[1 2 0]]

[[4 0 1]

[0 3 0]

[2 0 2]]

[[0 1 2]

[3 0 3]

[0 2 0]]

[[1 2 1]

[0 3 4]

[2 0 4]]

[[2 1 1]

[3 4 3]

[0 4 3]]

[[1 1 4]

[4 3 0]

[4 3 2]]]

[[[3 4 0]

[2 4 1]

[4 0 2]]

[[4 0 0]

[4 1 2]

[0 2 0]]

[[0 0 3]

[1 2 0]

[2 0 2]]

[[0 3 0]

[2 0 2]

[0 2 4]]

[[3 0 3]

[0 2 0]

[2 4 4]]

[[0 3 4]

[2 0 4]

[4 4 0]]

[[3 4 3]

[0 4 3]

[4 0 0]]

[[4 3 0]

[4 3 2]

[0 0 4]]]

[[[2 4 1]

[4 0 2]

[2 2 3]]

[[4 1 2]

[0 2 0]

[2 3 4]]

[[1 2 0]

[2 0 2]

[3 4 0]]

[[2 0 2]

[0 2 4]

[4 0 2]]

[[0 2 0]

[2 4 4]

[0 2 2]]

[[2 0 4]

[4 4 0]

[2 2 4]]

[[0 4 3]

[4 0 0]

[2 4 4]]

[[4 3 2]

[0 0 4]

[4 4 0]]]

[[[4 0 2]

[2 2 3]

[4 4 2]]

[[0 2 0]

[2 3 4]

[4 2 2]]

[[2 0 2]

[3 4 0]

[2 2 1]]

[[0 2 4]

[4 0 2]

[2 1 1]]

[[2 4 4]

[0 2 2]

[1 1 3]]

[[4 4 0]

[2 2 4]

[1 3 4]]

[[4 0 0]

[2 4 4]

[3 4 3]]

[[0 0 4]

[4 4 0]

[4 3 1]]]

[[[2 2 3]

[4 4 2]

[0 4 2]]

[[2 3 4]

[4 2 2]

[4 2 1]]

[[3 4 0]

[2 2 1]

[2 1 0]]

[[4 0 2]

[2 1 1]

[1 0 2]]

[[0 2 2]

[1 1 3]

[0 2 4]]

[[2 2 4]

[1 3 4]

[2 4 1]]

[[2 4 4]

[3 4 3]

[4 1 0]]

[[4 4 0]

[4 3 1]

[1 0 1]]]

[[[4 4 2]

[0 4 2]

[0 2 2]]

[[4 2 2]

[4 2 1]

[2 2 3]]

[[2 2 1]

[2 1 0]

[2 3 3]]

[[2 1 1]

[1 0 2]

[3 3 0]]

[[1 1 3]

[0 2 4]

[3 0 0]]

[[1 3 4]

[2 4 1]

[0 0 2]]

[[3 4 3]

[4 1 0]

[0 2 1]]

[[4 3 1]

[1 0 1]

[2 1 3]]]]

85. 创建一个二维数组子类,使 Z[i,j] == Z[j,i]

# 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)

[[ 3 10 4 5 5]

[10 1 8 13 9]

[ 4 8 6 42 16]

[ 5 13 42 5 3]

[ 5 9 16 3 9]]

86. 考虑一组具有形状(n,n)的p矩阵和一组具有形状(n,1)的p向量。 如何一次计算p矩阵乘积的总和? (结果有形状(n,1)) (★★★)

# 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.

[[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]

[200.]]

87. 考虑一个16x16阵列,如何获得块总和(块大小为4x4)? (★★★)

# 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)

[[16. 16. 16. 16.]

[16. 16. 16. 16.]

[16. 16. 16. 16.]

[16. 16. 16. 16.]]

88. 如何使用numpy数组实现游戏生命? (★★★)

# 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)

[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0

0 0 0 0 0 0 0 1 1 1 0 0 0 0]

[0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 1 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0

0 0 0 1 1 0 0 0 0 0 0 0 0 0]

[0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 1 0 0 1 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 1 0 0 1 0]

[0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 0 0]

[0 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1

0 0 0 0 0 0 0 0 0 1 1 0 0 0]

[0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1

0 0 0 0 0 0 0 0 0 1 1 0 0 0]

[0 0 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 1 0 1 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 1 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 1 0 0 0 1 0 0 1 1 0 0 0 0]

[0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 1 1 0 0 1 1 1 0 0 0]

[0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 1 1 0 0 0 0]

[0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 1 1 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 1 0 0 1 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 1 0 1 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

89. 如何获取数组的n个最大值 (★★★)

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]])

[9995 9996 9997 9998 9999]

[9997 9999 9998 9996 9995]

90. 给定任意数量的向量,构建笛卡尔积(每个项的每个组合) (★★★)

# 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])))

[[1 4 6]

[1 4 7]

[1 5 6]

[1 5 7]

[2 4 6]

[2 4 7]

[2 5 6]

[2 5 7]

[3 4 6]

[3 4 7]

[3 5 6]

[3 5 7]]

91. 如何从常规数组创建记录数组? (★★★)

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)

[(b'Hello', 2.5, 3) (b'World', 3.6, 2)]

92. 考虑一个大的向量Z,使用3种不同的方法将Z计算为3的幂 (★★★)

# Author: Ryan G.

x = np.random.rand(int(5e7))

%timeit np.power(x,3)

%timeit x*x*x

%timeit np.einsum('i,i,i->i',x,x,x)

1.26 s ± 38.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

171 ms ± 31.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

288 ms ± 27.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

93. 考虑形状 (8,3) 和 (2,2) 的两个阵列A和B. 如何查找包含B的每一行元素的A行,而不管B中元素的顺序如何? (★★★)

# 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)

[0 5 6]

94. 考虑10x3矩阵,提取具有不等值的行 (e.g. [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)

[[1 0 1]

[1 3 3]

[2 0 3]

[0 0 4]

[4 1 1]

[2 3 4]

[0 0 1]

[1 0 3]

[2 1 1]

[3 1 2]]

[[1 0 1]

[1 3 3]

[2 0 3]

[0 0 4]

[4 1 1]

[2 3 4]

[0 0 1]

[1 0 3]

[2 1 1]

[3 1 2]]

[[1 0 1]

[1 3 3]

[2 0 3]

[0 0 4]

[4 1 1]

[2 3 4]

[0 0 1]

[1 0 3]

[2 1 1]

[3 1 2]]

95. 将int的向量转换为矩阵二进制表示 (★★★)

# Author: Warren Weckesser

I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128])

B = ((I.reshape(-1,1) & (2np.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))

[[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 1]

[0 0 0 0 0 0 1 0]

[0 0 0 0 0 0 1 1]

[0 0 0 0 1 1 1 1]

[0 0 0 1 0 0 0 0]

[0 0 1 0 0 0 0 0]

[0 1 0 0 0 0 0 0]

[1 0 0 0 0 0 0 0]]

[[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 1]

[0 0 0 0 0 0 1 0]

[0 0 0 0 0 0 1 1]

[0 0 0 0 1 1 1 1]

[0 0 0 1 0 0 0 0]

[0 0 1 0 0 0 0 0]

[0 1 0 0 0 0 0 0]

[1 0 0 0 0 0 0 0]]

96. 给定一个二维数组,如何提取唯一的行?(★★★)

# 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)

[[0 0 1]

[0 1 1]

[1 0 0]

[1 1 1]]

97. 考虑2个向量A & B,写出einsum等效的inner,outer,sum和mul函数(★★★)

# 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)

array([[0.0, 0.0, 0., 0.0, 0.,

0.0, 0.0, 0.0, 0. , 0.],

[0.0, 0., 0., 0.0, 0.,

0.0, 0., 0., 0., 0.],

[0.0, 0.0, 0., 0.0, 0.,

0.0, 0., 0., 0., 0.],

[0.0, 0., 0., 0.0, 0.,

0.0, 0., 0., 0., 0.],

[0.0, 0.0, 0.0, 0.0, 0.0 ,

0.0, 0.0, 0.047382 , 0.0 , 0.0],

[0., 0., 0., 0., 0. ,

0., 0. , 0. , 0., 0.],

[0., 0., 0., 0.0, 0. ,

0. , 0., 0. , 0., 0. ],

[0.0, 0.0, 0.0, 0.0, 0.0,

0.0, 0.0, 0.0, 0.0, 0.0],

[0.0040046 , 0.00, 0.0, 0.00, 0.0,

0.0066891 , 0.00, 0.0, 0.0 , 0.0 ],

[0., 0., 0., 0.0, 0.,

0., 0., 0., 0., 0.]])

98. 考虑两个矢量(X,Y)描述的路径,如何使用等距样本对其进行采样 (★★★)?

# 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和2D数组X,从X中选择可以解释为具有n度的多项分布的绘制的行,即,仅包含整数并且总和为n的行。 (★★★)

# 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])

[[2. 0. 1. 1.]]

100. 计算一维阵列X的平均值的自举95%置信区间(即,重新采样具有替换N次的阵列的元素,计算每个样本的平均值,然后计算均值上的百分位数)。(★★★)

# 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.]

小讯
上一篇 2025-03-31 12:36
下一篇 2025-01-08 23:22

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/50243.html