numpy数组


transpose和swapaxes函数
transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数。 我们看如下一个numpy的数组: `arr=np.arange(16).reshape((2,2,4)) arr= array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) ` 那么有: arr.transpose(2,1,0) array([[[ 0, 8], [ 4, 12]], [[ 1, 9], [ 5, 13]], [[ 2, 10], [ 6, 14]], [[ 3, 11], [ 7, 15]]]) 为什么会是这样的结果呢,这是因为arr这个数组有三个维度,三个维度的编号对应为(0,1,2),比如这样,我们需要拿到7这个数字,怎么办,肯定需要些三个维度的值,7的第一个维度为0,第二个维度为1,第三个3,所以arr[0,1,3]则拿到了7 arr[0,1,3] #结果就是7 1 这下应该懂了些吧,好,再回到transpose()这个函数,它里面就是维度的排序,比如我们后面写的transpose(2,1,0),就是把之前第三个维度转为第一个维度,之前的第二个维度不变,之前的第一个维度变为第三个维度,好那么我们继续拿7这个值来说,之前的索引为[0,1,3],按照我们的转换方法,把之前的第三维度变为第一维度,之前的第一维度变为第三维度,那么现在7的索引就是(3,1,0) 同理所有的数组内的数字都是这样变得,这就是transpose()内参数的变化。 理解了上面,再来理解swapaxes()就很简单了,swapaxes接受一对轴编号,其实这里我们叫一对维度编号更好吧,比如: arr.swapaxes(2,1) #就是将第三个维度和第二个维度交换 array([[[ 0, 4], [ 1, 5], [ 2, 6], [ 3, 7]], [[ 8, 12], [ 9, 13], [10, 14], [11, 15]]]) 还是那我们的数字7来说,之前的索引是(0,1,3),那么交换之后,就应该是(0,3,1) 多说一句,其实numpy高维数组的切片也是这样选取维度的。 这就是transpose和swapaxes函数的讲解了 ———————————————— 版权声明:本文为CSDN博主「ML_BOY」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq1483661204/article/details/70543952
numpy.random.randn()
在python数据分析的学习和应用过程中,经常需要用到numpy的随机函数,由于随机函数random的功能比较多,经常会混淆或记不住,下面我们一起来汇总学习下。 import numpy as np 1 numpy.random.rand() numpy.random.rand(d0,d1,…,dn) rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1 dn表格每个维度 返回值为指定维度的array np.random.rand(4,2) array([[ 0.02173903, 0.44376568], [ 0.25309942, 0.85259262], [ 0.56465709, 0.95135013], [ 0.14145746, 0.55389458]]) np.random.rand(4,3,2) # shape: 4*3*2 array([[[ 0.08256277, 0.11408276], [ 0.11182496, 0.51452019], [ 0.09731856, 0.18279204]], [[ 0.74637005, 0.76065562], [ 0.32060311, 0.69410458], [ 0.28890543, 0.68532579]], [[ 0.72110169, 0.52517524], [ 0.32876607, 0.66632414], [ 0.45762399, 0.49176764]], [[ 0.73886671, 0.81877121], [ 0.03984658, 0.99454548], [ 0.18205926, 0.99637823]]]) 2 numpy.random.randn() numpy.random.randn(d0,d1,…,dn) randn函数返回一个或一组样本,具有标准正态分布。 dn表格每个维度 返回值为指定维度的array np.random.randn() # 当没有参数时,返回单个数据 -1.1241580894939212 np.random.randn(2,4) array([[ 0.27795239, -2.57882503, 0.3817649 , 1.42367345], [-1.16724625, -0.22408299, 0.63006614, -0.41714538]]) np.random.randn(4,3,2) array([[[ 1.27820764, 0.92479163], [-0.15151257, 1.3428253 ], [-1.30948998, 0.15493686]], [[-1.49645411, -0.27724089], [ 0.71590275, 0.81377671], [-0.71833341, 1.61637676]], [[ 0.52486563, -1.7345101 ], [ 1.24456943, -0.10902915], [ 1.27292735, -0.00926068]], [[ 0.88303 , 0.46116413], [ 0.13305507, 2.44968809], [-0.73132153, -0.88586716]]]) 标准正态分布介绍 标准正态分布—-standard normal distribution 标准正态分布又称为u分布,是以0为均值、以1为标准差的正态分布,记为N(0,1)。 3 numpy.random.randint() 3.1 numpy.random.randint() numpy.random.randint(low, high=None, size=None, dtype=’l’) 返回随机整数,范围区间为[low,high),包含low,不包含high 参数:low为最小值,high为最大值,size为数组维度大小,dtype为数据类型,默认的数据类型是np.int high没有填写时,默认生成随机数的范围是[0,low) np.random.randint(1,size=5) # 返回[0,1)之间的整数,所以只有0 array([0, 0, 0, 0, 0]) np.random.randint(1,5) # 返回1个[1,5)时间的随机整数
np.sqrt(arr)求开方
modf函数分别返回整数和小数部分
In [146]: arr = np.random.randn(5) * 5 In [147]: arr Out[147]: array([-3.2623, -6.0915, -6.663 , 5.3731, 3.6182]) In [148]: remainder, whole_part = np.modf(arr) In [149]: remainder Out[149]: array([-0.2623, -0.0915, -0.663 , 0.3731, 0.6182, 0.45 , 0.0077]) In [150]: whole_part Out[150]: array([-3., -6., -6., 5., 3., 3., 5.])


numpy.where()三元表达式x if condition else y的⽮量化版本。
1. In [165]: xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5]) In [166]: yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5]) In [167]: cond = np.array([True, False, True, True, False]) 假设我们想要根据cond中的值选取xarr和yarr的值:当cond中的 值为True时,选取xarr的值,否则从yarr中选取。列表推导式的 写法应该如下所示: In [168]: result = [(x if c else y) .....: for x, y, c in zip(xarr, yarr, cond)] In [169]: result Out[169]: [1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999] 等价于: In [170]: result = np.where(cond, xarr, yarr) In [171]: result Out[171]: array([ 1.1, 2.2, 1.3, 1.4, 2.5]) 2. np.where的第⼆个和第三个参数不必是数组,它们都可以是标量 值。在数据分析⼯作中,where通常⽤于根据另⼀个数组⽽产⽣ ⼀个新的数组。假设有⼀个由随机数据组成的矩阵,你希望将所 有正值替换为2,将所有负值替换为-2。若利⽤np.where,则会 ⾮常简单: In [172]: arr = np.random.randn(4, 4) In [173]: arr Out[173]: array([[-0.5031, -0.6223, -0.9212, -0.7262], [ 0.2229, 0.0513, -1.1577, 0.8167], [ 0.4336, 1.0107, 1.8249, -0.9975], [ 0.8506, -0.1316, 0.9124, 0.1882]]) In [174]: arr > 0 Out[174]: array([[False, False, False, False], [ True, True, False, True], [ True, True, True, False], [ True, False, True, True]], dtype=bool) In [175]: np.where(arr > 0, 2, -2) Out[175]: array([[-2, -2, -2, -2], [ 2, 2, -2, 2], [ 2, 2, 2, -2], [ 2, -2, 2, 2]]) 3. 使⽤np.where,可以将标量和数组结合起来。例如,我可⽤常数 2替换arr中所有正的值: In [176]: np.where(arr > 0, 2, arr) # set only positive values Out[176]: array([[-0.5031, -0.6223, -0.9212, -0.7262], [ 2. , 2. , -1.1577, 2. ], [ 2. , 2. , 2. , -0.9975], [ 2. , -0.1316, 2. , 2. ]])
arr.mean(),np.sum(arr),两种用法效果一样
1. In [177]: arr = np.random.randn(5, 4) In [178]: arr Out[178]: array([[ 2.1695, -0.1149, 2.0037, 0.0296], [ 0.7953, 0.1181, -0.7485, 0.585 ], [ 0.1527, -1.5657, -0.5625, -0.0327], [-0.929 , -0.4826, -0.0363, 1.0954], [ 0.9809, -0.5895, 1.5817, -0.5287]]) In [179]: arr.mean() Out[179]: 0.19607051119998253 In [180]: np.mean(arr) Out[180]: 0.19607051119998253 In [181]: arr.sum() Out[181]: 3.9214102239996507 2.这⾥,arr.mean(1)是“计算⾏的平均值”,arr.sum(0)是“计算每列 的和”。 In [182]: arr.mean(axis=1) Out[182]: array([ 1.022 , 0.1875, -0.502 , -0.0881, 0.3611]) In [183]: arr.sum(axis=0) Out[183]: array([ 3.1693, -2.6345, 2.2381, 1.1486])
cumsum累加函数,其中arr.cumsum(axis=0)表示沿着列方向加,cumprod原理同
In [184]: arr = np.array([0, 1, 2, 3, 4, 5, 6, 7]) In [185]: arr.cumsum() Out[185]: array([ 0, 1, 3, 6, 10, 15, 21, 28])

any和all方法
In [192]: bools = np.array([False, False, True, False]) In [193]: bools.any() Out[193]: True In [194]: bools.all() Out[194]: False 这两个⽅法也能⽤于⾮布尔型数组,所有⾮0元素将会被当做 True。
排序
1. In [195]: arr = np.random.randn(6) In [196]: arr Out[196]: array([ 0.6095, -0.4938, 1.24 , -0.1357, 1.43 , 152 In [197]: arr.sort() In [198]: arr Out[198]: array([-0.8469, -0.4938, -0.1357, 0.6095, 1.24 2.多维数组可以在任何⼀个轴向上进⾏排序,只需将轴编号传给 sort即可: In [199]: arr = np.random.randn(5, 3) In [200]: arr Out[200]: array([[ 0.6033, 1.2636, -0.2555], [-0.4457, 0.4684, -0.9616], [-1.8245, 0.6254, 1.0229], [ 1.1074, 0.0909, -0.3501], [ 0.218 , -0.8948, -1.7415]]) In [201]: arr.sort(1) #根据行进行排序 In [202]: arr Out[202]: array([[-0.2555, 0.6033, 1.2636], [-0.9616, -0.4457, 0.4684], [-1.8245, 0.6254, 1.0229], [-0.3501, 0.0909, 1.1074], [-1.7415, -0.8948, 0.218 ]])
计算数组分位数
顶级⽅法np.sort返回的是数组的已排序副本,⽽就地排序则会修 改数组本身。计算数组分位数最简单的办法是对其进⾏排序,然 后选取特定位置的值: In [203]: large_arr = np.random.randn(1000) In [204]: large_arr.sort() In [205]: large_arr[int(0.05 * len(large_arr))] # 5% quantile Out[205]: -1.5311513550102103
唯一化
1. 唯⼀化以及其它的集合逻辑 NumPy提供了⼀些针对⼀维ndarray的基本集合运算。最常⽤的 可能要数np.unique了,它⽤于找出数组中的唯⼀值并返回已排 序的结果: In [206]: names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', In [207]: np.unique(names) Out[207]: array(['Bob', 'Joe', 'Will'], dtype='<U4') In [208]: ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4]) In [209]: np.unique(ints) Out[209]: array([1, 2, 3, 4]) 2. 等价于python代码 In [210]: sorted(set(names)) Out[210]: ['Bob', 'Joe', 'Will'] 3. 另⼀个函数np.in1d⽤于测试⼀个数组中的值在另⼀个数组中的 成员资格,返回⼀个布尔型数组:
numpy集合函数

numpy数组的⽂件输⼊输出
NumPy能够读写磁盘上的⽂本数据或⼆进制数据。这⼀⼩节只 讨论NumPy的内置⼆进制格式,因为更多的⽤户会使⽤pandas 或其它⼯具加载⽂本或表格数据(⻅第6章)。 np.save和np.load是读写磁盘数组数据的两个主要函数。默认情 况下,数组是以未压缩的原始⼆进制格式保存在扩展名为.npy的 ⽂件中的: 1. In [213]: arr = np.arange(10) In [214]: np.save('some_array', arr) 如果⽂件路径末尾没有扩展名.npy,则该扩展名会被⾃动加上。 然后就可以通过np.load读取磁盘上的数组: In [215]: np.load('some_array.npy') Out[215]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 2. 通过np.savez可以将多个数组保存到⼀个未压缩⽂件中,将数组 以关键字参数的形式传⼊即可: In [216]: np.savez('array_archive.npz', a=arr, b=arr) 加载.npz⽂件时,你会得到⼀个类似字典的对象,该对象会对各 个数组进⾏延迟加载: 如果数据压缩的很好,就可以使⽤numpy.savez_compressed: In [219]: np.savez_compressed('arrays_compressed.npz',
常用的线性代数函数
In [231]: from numpy.linalg import inv, qr In [232]: X = np.random.randn(5, 5) In [233]: mat = X.T.dot(X) In [234]: inv(mat) Out[234]: array([[ 933.1189, 871.8258, -1417.6902, -1460.4005, 1782.1391], [ 871.8258, 815.3929, -1325.9965, -1365.9242, 1666.9347], [-1417.6902, -1325.9965, 2158.4424, 2222.0191, -2711.6822], [-1460.4005, -1365.9242, 2222.0191, 2289.0575, -2793.422 [ 1782.1391, 1666.9347, -2711.6822, -2793.422 , 3409.5128]]) In [235]: mat.dot(inv(mat)) Out[235]: array([[ 1., 0., -0., -0., -0.], [-0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [-0., 0., 0., 1., -0.], [-0., 0., 0., 0., 1.]]) In [236]: q, r = qr(mat) In [237]: r Out[237]: array([[-1.6914, 4.38 , 0.1757, 0.4075, -0.7838], [ 0. , -2.6436, 0.1939, -3.072 , -1.0702], [ 0. , 0. , -0.8138, 1.5414, 0.6155], [ 0. , 0. , 0. , -2.6445, -2.1669], [ 0. , 0. , 0. , 0. , 0.0002]]) 表达式X.T.dot(X)计算X和它的转置X.T的点积。

伪随机数


浙公网安备 33010602011771号