Numpy应用100问
对于从事机器学习的人,python+numpy+scipy+matplotlib是重要的基础;它们基本与matlab相同,而其中最重要的当属numpy;因此,这里列出100个关于numpy函数的问题,希望读者通过“题海”快速学好numpy;题中示例可以粘贴运行,读者可以边执行边看效果;
1 如何引入numpy?
import numpy as np(或者from numpy import *)
2 如何定义一个数组?
import numpy as np
x = np.array([[1,2,3],[5,6,7],np.int32])
y = x[.,1] # 取出x的一列,y = [2,6]
3 实部和虚部如何提取?
x = np.array([ 1+2j, 3 + 4j, 5+6j] )
>> x.imag # x.imag就是x集合中取出的虚部的集合
>> array([ 2., 4., 6.])
>> x.imag = [4,8,12] # 将集合x.imag一次赋值
4 序列如何排序?
>> x = [3,4,1,2,5]
>> x.argsort()
>> [2,3,0,1,4] # 排序后的序列下标
5 何为矩阵的坐标轴axis=0或axis=1是啥?
axis = 0 是指按照列方向,axis = 1是按照行方向(操作)。
6 如何用choose函数?
>> x = np.arange(25).reshape(5,5) # 定义矩阵x[5][5]
array( [
[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]
] )
>>np.choose([1,2,1,2,1],x) # 选择x的[1,2,1,2,1]行对应数
>>[5,11,7,13,9]
再如:
a = np.array([[0,1,2],[2,3,0],[1,0,1]])
b = np.array([12,-11,8,7])
np.choose( a, b )
>>
array([[ 12, -11, 8], # 取a的架构,用b的item填写
[ 8, 7, 12],
[-11, 12, -11]])
7 何为裁剪clips函数?
是按照一个范围剪切数组;
8 何为all和any函数?
all和any函数测试两个矩阵的元素;当全部相等用all,部分相等用any;
示例:
a = np.arange(15).reshape(3,5)
b = a.copy()
(a ==b).all()
>>True
9 何为argmax和argmin,argsort函数?
argmax和argmin返回矩阵中,最大元或最校元的下标;argsort返回矩阵排序的下标;其中可选坐标横向或纵向;
10 何为compress 函数?
a = np.arange(15).reshape(3,5)
np.compress([True,False,True],a,axis=0) #此处为行方向,取0,2向量构成的矩阵
>>
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14]])
11 如何求共轭复数conjugate函数?
np.conjugate(1+3j)
>> 1-3j
12 copy函数是啥?
a = b.copy()或 a = np.copy(b) #生成b的副本,赋值给a
13 何为cumprod乘积?
b = array([3,8,9])
np.cumprod(b) #该乘积是将[a,b,c]转换成[a,a*b,a*b*c]的乘积
>>[3,24,216]
另:
a = array([[1, 2, 3],
[4, 5, 6]])
np.cunprod(a)
>>
array([ 1, 2, 6, 24, 120, 720])
14 何为cumsum和?
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
cumsum(b) #累计的和数列,类似于阶乘的数列
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66])
15 何为diagonal函数?
求一个矩阵的主对角元素组成的数列。
a = array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
diagonal(a)
>>
array([0,6,12) #注意,不论是否方阵;
16 何为dot函数?
dot是两个矩阵相乘的函数,当矩阵为一维时,是向量内积,二维的是矩阵相乘;
17何为mean函数?
就是对矩阵所有元求平均;
18何为nonzero函数?
nonzero(a)返回a中非零数据项的下标;
a = array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 0, 11, 12, 0, 14]])
nonzero(a)
>>
(array([0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2], dtype=int64),
array([1, 2, 3, 4, 0, 1, 2, 3, 4, 1, 2, 4], dtype=int64))
另:(a〉3).nonzero() #表示大于3的数的下标
19 何为prod函数?
就是将矩阵所有元素相乘;
a = array([ 0, 1, 2, 3, 4])
prod(a)
>> 24
20 何为ptp函数?
是指矩阵按照某个轴上最大值和最小值得差,即数据gap范围;
21 何为put函数?
将指定下标的元素,赋值为其它值;
22 何为ravel函数?
将矩阵扁平化,即转换成一维排列;参见ndarray的flat和flaten函数;
23 何为repeat函数?
将矩阵每个元素重复n遍,放入一维序列中;
a = array([[1,2],[4,5])
np.repeat(a,2) #将a的元素重复2次
>> array([1,1,2,2,4,4,5,5])
24 何为reshape函数?
将矩阵所有元素重新排列,构成新的矩阵;数据不变;
如:a = np.arange(12).reshape(3,4)
25 何为resize函数?
构成新的矩阵;数据可变;
a = np.array([[1,2,3]])
np.resize(a,[2,3])
>>
array([[1,2,3],[1,2,3]])
26 函数searchsorted的作用
若存在一个数,和一个排序向量;求该数在排序向量对应的下标;
np.searchsorted([1,2,3,4,5], 3)
>>
2
np.searchsorted([1,2,3,4,5], [3,-1,8])
>>
[2,0,5]
27 函数sort的用法
对矩阵排序,分两种:轴排序,扁平(无轴)排序
>>> a = np.array([[1,4],[3,1]])
>>> np.sort(a) # sort along the last axis
array([[1, 4],
[1, 3]])
>>> np.sort(a, axis=None) # sort the flattened array
array([1, 1, 3, 4])
>>> np.sort(a, axis=0) # sort along the first axis
array([[1, 1],
[3, 4]])
28 函数squeeze(a)如何用?
将一个具有冗余多维的向量,压缩成一维的向量;
>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
>>> np.squeeze(x).shape
(3,)
29 函数std()用法?
对矩阵各元素,求出标准均方差;
30 函数sum()用法?
对矩阵的所有函数进行求和。
>>> np.sum([0.5, 1.5])
2.0
>>> np.sum([0.5, 0.7, 0.2, 1.5], dtype=np.int32)
1
>>> np.sum([[0, 1], [0, 5]])
6
>>> np.sum([[0, 1], [0, 5]], axis=0)
array([0, 6])
>>> np.sum([[0, 1], [0, 5]], axis=1)
array([1, 5])
31 函数swapaxes的用法?
swapaxes(): 将n个维度中任意两个维度(坐标轴)进行调换
32 函数take的用法?
numpy.take(a, indices, axis=None, out=None, mode=’raise’)
该函数从a中取出indices下标所对应的元素;
>>> a = [4, 3, 5, 7, 6, 8]
>>> indices = [0, 1, 4]
>>> np.take(a, indices)
array([4, 3, 6])
33 函数trace的用途?
numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None)
求矩阵对角线元素的和;
34 矩阵的transpose函数?
numpy.transpose(a, axes=None)
上述给出a矩阵的转置矩阵;
35 函数var是什么?
numpy.var(a, axis=None, dtype=None, out=None, ddof=0)
是求出某个轴向的方差;
36 何为矩阵的切割Slicing?
就是将矩阵通过[i:j:k]转换的新矩阵,i是起始下标,j是终了下标,k是步长;这些下标都能为负;
如:
>>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> x[1:7:2]
array([1, 3, 5])
>>> x[1:7:1]
array([1, 2, 3, 4, 5, 6])
37 如何求一个向量的转置?
a = np.array([1,2,3]) 的转置依旧是它本身
b = np.array([ [1,2,3] ])的转置是
array [[1],
[2],
[3] ]
要想从a求出列向转置需要:
a[:,np.newaxis ] 这个语法,切记之
38 如何求行向量和列向量之和?
a = np.array([1,2,3])
b = np.array([[x],[y]])
a + b = array([ [1+x,2+x,3+x], [1+y,2+y,3+y] ])这就是规则!
39 如何将数据从文本文件读入?
numpy.loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0,usecols=None, unpack=False, ndmin=0)[source]
例子:
V1,V2 = np.loadtxt('datas.txt',dtype='float',delimiter=',',skiprows =1,usecols=[1,2],unpack = True)
参数解释:
'datas.txt' ---文件名
dtype='float' ---数据格式
delimiter=',' ---分隔符逗号
skiprows =1 ---跳过第一行
usecols=[1,2] ---选第1,2列读出
unpack = True ---读出两列将拆开,分别给V1和V2
converters=None ---缺省数据用什么填充
40 如何将数据写出到文本文件?
numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ')
fname ---文件名
X ---写出的数据表格
fmt='%.18e' ---数据格式
delimiter=',' ---分隔符逗号
newline='\n' ----换行
newline='\n' ----表头
footer='' ----表尾
comments='# ' 注释
41 linspace和arange区别?
x = np.linspace(0, 4*np.pi, 100) 在0-4pi中间有100个点
x = np.arange(0, 4*np.pi, 2) 在0-4pi中间每两个点抽样一次
42 newaxis如何使用?
关于newaxis是很难理解的东西,而矩阵变换中又常用,这里用形式表现之:
1:a = array([A,B,C]) 这里ABC可能是数列,也可能是单独数,当使用a[:,newaxis]时,一定是如下格式:
将a中的最外层不管,将次外层看成独立元素,将他们加上“[]”,然后进行行排列
a[:,newaxis]等价于
[[A],
[B],
[C]]
2:a = array([A,B,C]) 这里ABC可能是数列,也可能是单独数,当使用a[newaxis,:]时,一定是如下格式:
在a上加外扩号:
a[newaxis,:] = array([ [A,B,C] ])
举例:
>>>print a.shape
(3L, 3L)
b = a[:,newaxis]
>>>print a[:,newaxis]
[[[0 1 3]]
[[4 5 6]]
[[7 8 9]]]
>>>print b.shape
(3L, 1L, 3L) //意思为三行,每行是[1,3]的矩阵
当 b = a[ newaxis,:]
>>>print b
[[[0 1 3]
[4 5 6]
[7 8 9]]]
>>>print b.shape
(1L, 3L, 3L) //意思为1行,内部是[3,3]的矩阵;
43 如何构造一个hilbert矩阵?
构造10X10的希尔伯特矩阵,参考第42问,第38问:
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
44 何为logspace?
s = np.logspace(2.0, 3.0, num=3,base =4)
等价于
r =np.linspace(2,3,3)
l = 4**r
45 何为numpy.meshgrid(x, y)?
用两个1维向量变换出两个矩阵X,Y,其规则如下:
对于向量 x, y ,长度 Nx=len(x) 和 Ny=len(y), 返回矩阵X, Y 其中X 和 Y 形状shape= (Ny, Nx) ,填充数据为 x的Ny重复, 后者为 y的Nx次重复.
例:
>>> X, Y = np.meshgrid([1,2,3], [4,5,6,7])
>>> X
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
>>> Y
array([[4, 4, 4],
[5, 5, 5],
[6, 6, 6],
[7, 7, 7]])
46 何为mgrid?
也是一种从向量产生双矩阵的方法,如下:
>>> np.mgrid[0:5,0:5]
array([[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4]],
[[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]]])
>>> np.mgrid[-1:1:5j]
array([-1. , -0.5, 0. , 0.5, 1. ])
47 如何numpy.ravel实现矩阵扁平化?
例:
>>> x = np.array([[1, 2, 3], [4, 5, 6]])
>>> print(np.ravel(x))
[1 2 3 4 5 6]
48 如何理解np.nditer(a)?
请看代码:
>>> a = np.arange().reshape(,)
>>> for x in np.nditer(a):
... print x,
...
上述代码中,np.nditer(a)将a的元素扁平化后存入对象np.nditer中,然后读取出来,注意np.nditer不是个列表,是对象;不可用print np.nditer(a)打印出来;用时要注意;
49 如何实现数组元素无差别函数变换?
所谓无差别函数操作就是将每一个元素按照同样变换方式,并写回;比如a中的元素都乘2,这是比较简单的变换,常规通过a *=2就能完成,但是变换如果很复杂,比如每个元素求自然对数,就无法简单表示,因此需要下列代码完成:
>>> a = np.arange().reshape(,)
>>> a
array([[, , ],
[, , ]])
>>> for x in np.nditer(a, op_flags=['readwrite']):
... x[...] = * x
...
>>> a
array([[ , , ],
[ , , ]])
注意打开读写标志op_flags=['readwrite'],x[...]不可写成x;因为x是从对象中读出的临时变量;而x[...]是当前临时变量x所面向的数组内地址,用以指明当前x写到哪里。
50 什么是class numpy.ndenumerate(arr)?
ndenumerate和nditer类似,只是ndenumerate不返回元素的值,返回的全是下标;下标有两组,一组是数组的(Nx和Ny)另一组是nditer的顺序标号;与nditer同,不可用print np.ndenumerate(a)打印;
>>> a = np.arange(6).reshape(2,3) >>> for index, x in np.ndenumerate(a):
...: print(index, x)
...:
((0, 0), 0)
((0, 1), 1)
((0, 2), 2)
((1, 0), 3)
((1, 1), 4)
((1, 2), 5)
51 如何理解np的mean函数的axis?
关于numpy mean函数的axis参数,理解多维矩阵的"求和"、"平均"操作确实太恶心了,numpy提供的函数里还有一堆参数,搞得晕头转向的,这里做个笔记,提醒一下自己, 下面是例程
import numpy as np
X = np.array([[1, 2], [4, 5], [7, 8]])
print np.mean(X, axis=0, keepdims=True)
print np.mean(X, axis=1, keepdims=True)
结果是分别是
[[ 1.5]
[[ 4. 5.]] [ 4.5]
[ 7.5]]
我个人比较raw的认识就是,axis=0,那么输出矩阵是1行,求每一列的平均(按照每一行去求平均);axis=1,输出矩阵是1列,求每一行的平均(按照每一列去求平均)。还可以这么理解,axis是几,那就表明哪一维度被压缩成1。
再举个更复杂点的例子,比如我们输入为batch = [128, 28, 28],可以理解为batch=128,图片大小为28×28像素,我们相求这128个图片的均值,应该这么写
m = np.mean(batch, axis=0)
输出结果m的shape为(28,28),就是这128个图片在每一个像素点平均值。
52 矩阵相关计算如何实现?
1)定义:
a = np.matrix([ [, , , ],
[, , , ],
[, , , ],
[, , , ] ])
2)加法减法
#矩阵乘法:
b = a * a #not matrix multiplication!
#or
c = np.dot(a, a) #matrix multiplication
#or
d = a
np.dot(a, a, d) #matrix multiplication
a =np.array([,,,,])
s =np.array([[],[],[]])
print( a )
print (s)
print(a+s) #此处a和s可以交换
结果:
[1 3 4 5 6]
[[13]
[ 4]
[ 6]]
[[14 16 17 18 19]
[ 5 7 8 9 10]
[ 7 9 10 11 12]]
55 logspace指数序列的产生?
>>> a = np.logspace(0,9,10,base=2)
>>> a
array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])
每一项的形态是base=2的0-9次方序列
56 numpy如何产生等比数列?
import numpy as np
np.logspace(2.0, 3.0, num=4)
array([ 100. , 215.443469 , 464.15888336, 1000. ])
57 如何生成复杂矩阵?
通过形式函数是现,比如:
b = np.fromfunction(lambda x,y,z:x*100+y*10+z,(3,3,3),dtype=int)
58 如何遍历数组?
分三个办法:
第一种,最常用的,通过for in遍历数组
colours = ["red","green","blue"] for colour in colours:
print colour
第二种,先获得数组的长度,然后根据索引号遍历数组,同时输出索引号
colours = ["red","green","blue"]
for i in range(0, len(colours)):
print i, colour[i]
第三种 通过迭代器完成
for element in b.flat:
print element,
59 如何定义等距序列numpy.linspace?
函数原型numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
start : scalar(标量值),表明序列起始数
stop : scalar(标量值),序列终结位置, 若endpoint=True,序列包含end;若endpoint=False,序列不包含end;
num:int 序列中元素个数
endpoint : bool 如果是真,则一定包括stop,如果为False,一定不会有stop
retstep : bool 如果真,将间隔步长也返回,否则,不返回步长
dtype:数据的类型(int32,float32)
实例:
向量无论如何转置,都是它本身;如:
s_data = np.linspace(-1,1,30)
r_data = np.transpose(s_data) 在此,s_data和r_data 两个向量完全一样。而 x_data = np.linspace(-1,1,30)[:,np.newaxis]
y_data = np.linspace(-1,1,30)[np.newaxis,:]
就成了[30X1]和[1X30]的矩阵。 61 如何求矩阵的逆矩阵?
A = np.array( [[1,-2,1],[0,2,-1],[1,1,-2]] )
B = np.linalg.inv( A )
print(B) 62 求矩阵行列式
A = np.array( [[1,-2,1],[0,2,-1],[1,1,-2]] )
B = np.linalg.det( A )
print(B) 63 获取张量的最小量对应的序号
当axis=None时,为张量展开成一维单列的序号,否则就是行向,或列向的若干序号。
a = np.array([ [,,],
[,,],
[,,]])
print(np.argmin(a,axis=None))
64 将某个张量矩阵写成二进制的位张量np.unpackbits
a = np.array([[2], [7], [23]], dtype=np.uint8)
>>> a
array([[ 2],
[ 7],
[23]], dtype=uint8)
b = np.unpackbits(a, axis=1)
>>> b
array([[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)
65 将某个张量改变形状,但数值不变numpy.
reshape
(a, newshape, order='C')
>>> a = np.array([[1,2,3], [4,5,6]])
>>> np.reshape(a, 6)
array([1, 2, 3, 4, 5, 6])
>>> np.reshape(a, 6, order='F')
array([1, 4, 2, 5, 3, 6])
>>> np.reshape(a, (3,-1)) # the unspecified value is inferred to be 2
array([[1, 2],
[3, 4],
[5, 6]])
66 numpy.matrix系列函数
matrix.T |
Returns the transpose of the matrix. |
matrix.H |
Returns the (complex) conjugate transpose of self. |
matrix.I |
Returns the (multiplicative) inverse of invertible self. |
matrix.A |
Return self as an ndarray object. |
67 内存和文件的映射
Memory-mapped file arrays
>>> a = memmap('newfile.dat', dtype=float, mode='w+', shape=1000)
>>> a[10] = 10.0
>>> a[30] = 30.0
>>> del a
>>> b = fromfile('newfile.dat', dtype=float)
>>> print b[10], b[30]
10.0 30.0
>>> a = memmap('newfile.dat', dtype=float)
>>> print a[10], a[30]
10.0 30.0
Numpy应用100问的更多相关文章
- 《区块链100问》第75集:大零币Zcash是什么?
Zcash,全称Zero Cash,简称ZEC,中文叫大零币,研发者为Zooko Wilcox,诞生于2011年11月9日. 采用零知识证明机制提供完全的支付保密性,是目前匿名性最强的数字资产.零知识 ...
- oracle刚開始学习的人经常使用操作100问
oracle刚開始学习的人经常使用操作100问 1. Oracle安装完毕后的初始口令? internal/oracle sys/change_on_install system/manager ...
- [灵魂拷问]MySQL面试高频100问(工程师方向)
作者:呼延十 juejin.im/post/5d351303f265da1bd30596f9 前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉 ...
- AI面试必备/深度学习100问1-50题答案解析
AI面试必备/深度学习100问1-50题答案解析 2018年09月04日 15:42:07 刀客123 阅读数 2020更多 分类专栏: 机器学习 转载:https://blog.csdn.net ...
- MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)
写在之前:不建议那种上来就是各种面试题罗列,然后背书式的去记忆,对技术的提升帮助很小,对正经面试也没什么帮助,有点东西的面试官深挖下就懵逼了. 个人建议把面试题看作是费曼学习法中的回顾.简化的环节,准 ...
- 阿里面试100%问到,JVM性能调优篇
JVM 调优概述 性能定义 吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标. 延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集 ...
- Android 面试100问- 0序0
准备找android方面的工作,现收集面试题,打算收集100个并记录
- JAVA专业术语面试100问
前言:面试技巧另外开篇再说,先上面试干货吧.Redis.消息队列.SQL不要走开,关注后更精彩! 1.面向对象的特点有哪些? 抽象.继承.封装.多态. 2.接口和抽象类有什么联系和区别? 3.重载和重 ...
- Android handler 详解(面试百分之100问到)
handler在Android中被称为“消息处理者”,在多线程中比较常用. handler内部实现原理 handler实现机制:1,Message对象,表示要传递的一个消息,内部使用链表数据结构实现一 ...
随机推荐
- how to use ldid
1.进入管理员权限 sudo -s 2.赋予app运行权限 chmod -R 777 cellmap.app 3.查看app权限 ldid -e cellmap.app/cellmap 4.打开窗口 ...
- logging mod
http://blog.csdn.net/freeking101/article/details/52448580
- Javascript模式(第三章字面量与构造函数)------读书笔记
一 对象字面量 1.1对象字面量的语法 1,对象键值对哈希表,在其他的编程语言中称之为“关联数组”, 2 键值对里面的值,可以是原始类型也可以是其他类型的对象,称之为属性,函数称之为方法 3 自定义对 ...
- web异常流量定位:iftop+tcpdump+wireshark
一个简单的运维小经验. 场景:web服务器出现异常流量,web集群内部交互出现大流量,需要定位具体的http请求,以便解决问题. 目的:找出产生大流量的具体http请求. 工具: ift ...
- [Linux] - CentOS IP设置方法
CentOS 7的IP设置方法: 1.手动设置IP方法 a) 运行命令,cd到目录: cd /etc/sysconfig/network-scripts/ b) 运行命令:ls -l 找到类似这个文件 ...
- php 图片base64编码生成dataurl和保存为图片
<?php header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = 'aaa.j ...
- jquery 百度搜索
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(分组背包+dsu)
D. Arpa's weak amphitheater and Mehrdad's valuable Hoses Problem Description: Mehrdad wants to invit ...
- JSP EL表达式(转)
一.EL简介 1.语法结构 ${expression}2.[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字 ...
- Python 多线程
一.线程的使用 需导入模块: from threading import Thread 二.基本使用 def fun1(arg1, v): print(arg1) print('before') t1 ...