numpy-100 可以说是炒鸡经典的numpy学习资料了~原项目地址:numpy-100 各路大神提供的中文译版也有很多,不过为了巩固自己的学习成果,我还是自己进行了翻译+刷题+总结。对于每道题,均给出了原题翻译、正确答案,以及我的个人心得笔记。如下~
(1) 使用别名“np“调用numpy库。(★☆☆)(import … as …)
import numpy as np
#以下皆用np代numpy
(2) 显示当前numpy库的版本号和配置信息。(★☆☆)(np.__version__, np.show_config)
print(np.__version__)
print(np.show_config())
#v._n.()是常见的函数命名方式
(3) 创建一个大小为10的零向量。(★☆☆)(np.zeros)
np.zeros(10)
(4) 如何获取任意一个数组占用的内存大小?(★☆☆)(size, itemsize)
a = np.random.rand(2,3)
print('%dbytes' %(a.size * a.itemsize))
(5) 如何在命令行中获取numpy的add函数的文档?(★☆☆)(http://np.info)
#win
%run `python -c "import numpy; numpy.info(numpy.add)"`
#mac win版答案为参考答案,然而无法在我电脑的终端直接执行,于是我自己试出来以下命令:
python
import numpy
numpy.info(numpy.add)
(6) 创建一个大小为10的零向量,使之第5个元素为1。(★☆☆)(array[4])
a = np.zeros(10)
a[4] = 1
#如果使用np.zeros()创建更高维的向量,size需要嵌套括号。例如:np.zeros((3,3))
(7) 创建一个向量,使它的值为10到49。(★☆☆)(np.arange)
np.arange(10,50)
(8) 使一个向量逆序(第1个元素变成倒数第1个元素)。(★☆☆)(array[::-1])
a = a[::-1]
(9) 创建一个 3x3 矩阵,其值为0到8。(★☆☆)(reshape)
np.arange(9).reshape(3,3)
(10) 列出 [1,2,0,0,4,0] 该数组中非零元素的索引。(★☆☆)(np.nonzero)
np.nonzero([1,2,0,0,4,0])
(11) 创建一个 3x3 的单位矩阵。(★☆☆)(np.eye)
np.eye(3)
(12) 利用随机数创建一个 3x3x3 的数组。 (★☆☆)(np.random.random)
np.random.random((3,3,3))
#上式为参考答案,但个人觉得以下的写法更简单:
np.random.rand(3,3,3)
(13) 利用随机数创建一个 10x10 的数组,并获取数组的最小元素和最大元素。(★☆☆)(min, max)
a = np.random.rand(10,10)
print(np.min(a),np.max(a))
(14) 创建一个大小为30的随机向量,并求取均值。(★☆☆)(mean)
np.random.rand(30).mean()
(15) 创建一个二维数组,使其边界全部为1,内部全部为0。(★☆☆)(array[1:-1, 1:-1])
#参考答案
a = np.ones((10,10))
a[1:-1,1:-1] = 0
#另一种方法
a = np.zeros((10,10))
a[0]=1
a[-1]=1
a[:,0]=1
a[:,-1]=1
(16) 如何给一个已有的数组加上一个边界(值为0)?(★☆☆)(np.pad)
a = np.random.rand(1,20,(5,5)) #生成一个5x5的随机整数数组
a = np.pad(a,pad_width=1,mode='constant',constant_values=0) #为数组加上边界
np.pad(array, pad_width, mode, **kwargs)
#mode:'constant'常数|'edge'边缘值|'linear_ramp'边缘递减|'maximum'最大值|'minimum'最小值|'mean'均值|'median'中位数
(17) 以下的表达式的运行结果为?(★☆☆)(NaN = not a number, Inf = infinity)
print(0 * np.nan) #输出:nan
print(np.nan == np.nan) #输出:False
print(np.inf > np.nan) #输出:False
print(np.nan - np.nan) #输出:nan
print(np.nan in set([np.nan])) #输出:True
print(0.3 == 3 * 0.1) #输出:False
(18) 创建一个 5x5 矩阵,使得数字 1,2,3,4 恰好处在对角线下方。(★☆☆)(np.diag)
#参考答案
np.diag(1+np.arange(4),k=-1)
#另一种方法
np.diag(np.arange(1,5),-1)
# 0 处于对角线
# 1 位于对角线上方
(19) 创建一个8x8数组,使之形成棋盘格图案。 (★☆☆)(array[::2])
#参考答案
Z = np.zeros((8,8),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
#另一种方法
a = np.zeros((8,8))
a[::2,::2]=1
a[1::2,1::2]=1
(20) 对于一个形为 (6,7,8) 的数组,如何用形似 (x,y,z) 的索引取出其第100个元素?(★☆☆)(np.unravel_index)
np.unravel_index(99,(6,7,8))
(21) 使用 tile 函数创建一个 8x8 棋盘格矩阵。(★☆☆)(np.tile)
np.tile( np.array([[0,1],[1,0]]), (4,4))
(22) 对一个 5x5 矩阵进行标准化。(★☆☆)((x - mean) / std)
a = np.random.random((5,5))
a = (a - np.mean (a)) / (np.std (a))
(23) 创建一个自定义类型,用四个无符号字节存放颜色信息(RGBA)。 (★☆☆)(np.dtype)
color = np.dtype([("r", np.ubyte, 1),
("g", np.ubyte, 1),
("b", np.ubyte, 1),
("a", np.ubyte, 1)])
(24) 矩阵乘法(点乘):5x3矩阵 乘 3x2矩阵。(★☆☆)(np.dot | @)
#参考答案1
np.dot(np.ones((5,3)), np.ones((3,2)))
#参考答案2,python3.5及以上支持
np.ones((5,3)) @ np.ones((3,2))
(25) 给定一维数组,对值落在 [3,8] 区间内的元素取负。(★☆☆)(>, <=)
#参考答案
Z = np.arange(11)
Z[(3 < Z) & (Z <= 8)] *= -1
#另一种方法
a = np.arange(10)
for i in a:
if i>3 and i<=8:
a[i] = -a[i]
(26) 这段代码的运行结果是什么? (★☆☆)(np.sum)
print(sum(range(5),-1))
from numpy import *
print(sum(range(5),-1))
9
10
#range(5)表示0,1,2,3,4
#Python的sum(),对一系列数值求和,0+1+2+3+4-1=9
#numpy.sum(a,axis=None),数组求和,第二个参数表示参与运算的轴
#为了更好地理解numpy.sum()中的axis,用一个二维数组演示如下:
a = np.arange(20).reshape(4,5)
print('数组:','\n',a)
print('未指定轴:',np.sum(a))
print('轴=0:',np.sum(a,0))
print('轴=1:',np.sum(a,1))
print('轴=-1:',np.sum(a,-1))
print('轴=-2:',np.sum(a,-2))
数组:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
未指定轴: