【NumPy基础】100道numpy练习——Apprentice篇
@author:wepon
@blog:http://blog.csdn.net/u012162613/article/details/42811297
今天又用半小时扫了一下Apprentice篇里的10道exercise,不知道怎么翻译Apprentice(学徒~~)这个词,就直接以Apprentice篇作为题目了。numpy语法直白如水啊,花这些时间exercise有点浪费了.......Anyway,为了后面更熟练地用一些ML的包,利用闲暇时间扫一扫基本语法。原地址:https://github.com/rougier/numpy-100
1、将array属性设置为只读(read-only)
>>> Z = np.zeros(10) >>> Z.flags.writeable = False >>> Z[0] = 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: assignment destination is read-only
2、将笛卡尔坐标系下的点(x,y)转化为极坐标系的(R,T)
>>> Z = np.random.random((10,2)) >>> print Z [[ 0.49094922 0.58585236] [ 0.32265092 0.14445935] [ 0.8078448 0.70284832] [ 0.35341989 0.76888775] [ 0.01212107 0.43668101] [ 0.36924292 0.64075512] [ 0.22349212 0.4561141 ] [ 0.44836271 0.19591462] [ 0.6639701 0.16595659] [ 0.25559111 0.01741761]] >>> X,Y = Z[:,0], Z[:,1] >>> R = np.sqrt(X**2+Y**2) >>> T = np.arctan2(Y,X) %求反正切值 >>> print R [ 0.76436518 0.35351396 1.07079829 0.84622337 0.4368492 0.73953192 0.50792598 0.48929711 0.684396 0.2561839 ] >>> print T [ 0.87330531 0.42096163 0.71600756 1.13994582 1.5430462 1.04801403 1.11518737 0.41195346 0.24492773 0.06804118]
3、获取数组中最大值/最小值对应的下标,argmax()、argmin()函数
>>> Z = np.random.random(10) >>> print Z [ 0.90315764 0.06574957 0.86297424 0.46519603 0.01174512 0.60977188 0.52107975 0.6328012 0.12344019 0.05034712] >>> Z.argmax() 0 >>> Z.argmin() 4
4、meshgrid()产生格点矩阵,用于三维曲面的分格线座标
>>> Z = np.zeros((10,10), [('x',float),('y',float)]) >>> Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,10), np.linspace(0,1,10)) >>> print Z
5、各种数据类型的最大值/最小值,主要有8位、32位、64位整型,32位、64位浮点型
>>> for dtype in [np.int8, np.int32, np.int64]: ... print np.iinfo(dtype).min ... print np.iinfo(dtype).max ... -128 127 -2147483648 2147483647 -9223372036854775808 9223372036854775807 >>> for dtype in [np.float32, np.float64]: ... print np.finfo(dtype).min ... print np.finfo(dtype).max ... print np.finfo(dtype).eps ... -3.40282e+38 3.40282e+38 1.19209e-07 -1.79769313486e+308 1.79769313486e+308 2.22044604925e-16
6、生成一个矩阵,矩阵中每个元素由坐标(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)) ((0.0, 0.0), (0.0, 0.0, 0.0)) ((0.0, 0.0), (0.0, 0.0, 0.0)) ((0.0, 0.0), (0.0, 0.0, 0.0)) ((0.0, 0.0), (0.0, 0.0, 0.0)) ((0.0, 0.0), (0.0, 0.0, 0.0))]
7、生成10个坐标(x,y),计算两两之间的距离
>>> Z = np.random.random((10,2)) >>> X,Y = np.atleast_2d(Z[:,0]), np.atleast_2d(Z[:,1]) >>> D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2) >>> print D %D是10*10,对角线的值都是0
也可以直接用scipy里的cdist函数
# Much faster with scipy import scipy Z = np.random.random((10,2)) D = scipy.spatial.distance.cdist(Z,Z) print D
8、生成二维的高斯矩阵
>>> 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 %方差=1,均值=0 >>> G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) ) >>> print G [[ 0.36787944 0.44822088 0.51979489 0.57375342 0.60279818 0.60279818 0.57375342 0.51979489 0.44822088 0.36787944] [ 0.44822088 0.54610814 0.63331324 0.69905581 0.73444367 0.73444367 0.69905581 0.63331324 0.54610814 0.44822088] [ 0.51979489 0.63331324 0.73444367 0.81068432 0.85172308 0.85172308 0.81068432 0.73444367 0.63331324 0.51979489] [ 0.57375342 0.69905581 0.81068432 0.89483932 0.9401382 0.9401382 0.89483932 0.81068432 0.69905581 0.57375342] [ 0.60279818 0.73444367 0.85172308 0.9401382 0.98773022 0.98773022 0.9401382 0.85172308 0.73444367 0.60279818] [ 0.60279818 0.73444367 0.85172308 0.9401382 0.98773022 0.98773022 0.9401382 0.85172308 0.73444367 0.60279818] [ 0.57375342 0.69905581 0.81068432 0.89483932 0.9401382 0.9401382 0.89483932 0.81068432 0.69905581 0.57375342] [ 0.51979489 0.63331324 0.73444367 0.81068432 0.85172308 0.85172308 0.81068432 0.73444367 0.63331324 0.51979489] [ 0.44822088 0.54610814 0.63331324 0.69905581 0.73444367 0.73444367 0.69905581 0.63331324 0.54610814 0.44822088] [ 0.36787944 0.44822088 0.51979489 0.57375342 0.60279818 0.60279818 0.57375342 0.51979489 0.44822088 0.36787944]]
9、any函数,判断矩阵中的元素是否满足给定的条件,是的话返回True,否则返回False。例子:判断二维矩阵中有没有一整列数为0?
>>> Z = np.random.randint(0,3,(2,10)) >>> print Z [[1 0 1 2 2 0 1 0 1 0] [0 0 1 2 2 0 1 0 0 1]] >>> print Z.any(axis=0) %按列判断,全0则为False [ True False True True True False True False True True] >>> print (~Z.any(axis=0)).any() True
10、找出数组中与给定值最接近的数
>>> Z=array([[0,1,2,3],[4,5,6,7]]) >>> print Z [[0 1 2 3] [4 5 6 7]] >>> z=5.1 >>> np.abs(Z - z).argmin() 5 >>> print Z.flat[np.abs(Z - z).argmin()] 5
补充介绍:
flat是一个一维迭代器,将Z当成一维向量去遍历,Z[5]将超出原来矩阵的边界,Z.flat[5]才是正确的用法。
另外,不得不提flatten,它将矩阵摊平为一维向量:
>>> Z.flatten() array([0, 1, 2, 3, 4, 5, 6, 7])
时间: 2024-10-17 23:00:52