numpy 笔记

xiaoxiao2021-02-28  92

1.广播法则 不同维度的数组相加减,如下一维减去二维的数组 >>> b array([[0],        [1],        [2],        [3],        [4],        [5]]) >>> a array([1, 2, 3, 4, 4, 5]) >>> a-b array([[ 1,  2,  3,  4,  4,  5],        [ 0,  1,  2,  3,  3,  4],        [-1,  0,  1,  2,  2,  3],        [-2, -1,  0,  1,  1,  2],        [-3, -2, -1,  0,  0,  1],        [-4, -3, -2, -1, -1,  0]]) >>> x = np.array([[1,2,2],[2,3,5],[4,2,6],[9,12,4],[5,1,1]]) >>> x array([[ 1,  2,  2],        [ 2,  3,  5],        [ 4,  2,  6],        [ 9, 12,  4],        [ 5,  1,  1]]) >>> x.shape (5, 3) >>> y = np.array([[1,2,3]]) >>> y array([[1, 2, 3]]) >>> y.shape (1, 3) >>> x-y array([[ 0,  0, -1],        [ 1,  1,  2],        [ 3,  0,  3],        [ 8, 10,  1],        [ 4, -1, -2]]) tile函数用法:http://jingyan.baidu.com/article/219f4bf7da4d8dde442d389e.html tile(A,n),功能是将数组A重复n次,构成一个新的数组 >>> x-np.tile(y,(5,1)) array([[ 0,  0, -1],        [ 1,  1,  2],        [ 3,  0,  3],        [ 8, 10,  1],        [ 4, -1, -2]]) 2.sort排序 参考网站:https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html,http://blog.csdn.net/sloanqin/article/details/50130253 >>> a = np.array([[1,4],[3,1],[12,0],[2,1],[4,2]]) >>> a array([[ 1,  4],        [ 3,  1],        [12,  0],        [ 2,  1],        [ 4,  2]]) 调用np.sort(axis=0),差不多是按列排序,如下例子,有两列,每列都是从小到大排序 >>> a.sort(0) >>> a array([[ 1,  0],        [ 2,  1],        [ 3,  1],        [ 4,  2],        [12,  4]]) 若是调用np.sort(),差不多按行排序,如下例子,每一行,都是从小到大 >>> a.sort() >>> a array([[ 1,  4],        [ 1,  3],        [ 0, 12],        [ 1,  2],        [ 2,  4]]) 3.array和list相减还是array,matrix和list相减还是matrix,但是相减的结果再平方,array不会报错误,而matrix会报错      原因在于array可以平方,而matrix只有方阵时才可以平方      如果若真想平方,则必须采用np.square() >>> a = [1,2,3,4,5,6] >>> b = [2,4,5,8,7,9] >>> b = np.array(b) >>> b-a array([1, 2, 2, 4, 2, 3]) >>> (b-a)**2 array([ 1,  4,  4, 16,  4,  9]) >>> b =  np.mat(b) >>> b matrix([[2, 4, 5, 8, 7, 9]]) >>> b-a matrix([[1, 2, 2, 4, 2, 3]]) >>> (b-a)**2 Traceback (most recent call last):   File "<stdin>", line 1, in <module>   File "/usr/local/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.py", line 356, in __pow__     return matrix_power(self, other)   File "/usr/local/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.py", line 173, in matrix_power     raise ValueError("input must be a square array") ValueError: input must be a square array 如果若真想平方,则必须采用np.square() >>> np.square(b-a) matrix([[ 1,  4,  4, 16,  4,  9]]) 4.Python的星号(*、**)的作用 >>> a. 函数的可变参数 >>> b. 星号*把序列/集合解包(unpack)成位置参数,两个星号**把字典解包成关键字参数 5.numpy切片的一些小注意点 >>> a array([  1,   3,   4,  21,  35, 432,   5]) >>> a = a.reshape(len(a),1) >>> a array([[  1],        [  3],        [  4],        [ 21],        [ 35],        [432],        [  5]]) >>> a.shape (7, 1) >>> a[0:1]        # 这个很重要 array([[1]]) >>> a[0:1,0]    # 看看区别 array([1]) >>> a[0:1,:] array([[1]]) >>> a[1] array([3]) >>> a[1,0] 3 6.python列表生成式的注意点 --- 一般写列表生成式时,把要生成的元素放到前面,后面跟for循环,同时后面可以加上if判断 ---但是有一种特殊情况,当if判断语句中有生成的元素,则if放在前面,如下面例子: >>> L = ['Java' , 'C' , 'Swift' , 'Python' , 123] >>> print [s.lower() if isinstance(s , str) else s for s in L ] ['java', 'c', 'swift', 'python', 123] 这样if放在后面,会发生错误 >>> print [s.lower() for s in L if isinstance(s , str) else s]     File "<stdin>", line 1     print [s.lower() for s in L if isinstance(s , str) else s]                                                           ^  SyntaxError: invalid syntax 而去掉else s,就需要把if放在后面了 >>> print [s.lower() for s in L if isinstance(s , str)]   ['java', 'c', 'swift', 'python'] 还有个特例需要注意: >>> alist = [[(1, 2), (7, 5)], [(3, 9), (8, 5)], [(6, 1), (12, 90)]] >>> [para for para in l for l in alist] Traceback (most recent call last):   File "<stdin>", line 1, in <module> NameError: name 'l' is not defined >>> [para for l in alist for para in l] [(1, 2), (7, 5), (3, 9), (8, 5), (6, 1), (12, 90)] >>> [para for para in [l for l in alist]] [[(1, 2), (7, 5)], [(3, 9), (8, 5)], [(6, 1), (12, 90)]] 关键点就在于多了一个列表框[],因此才可以这样的顺序,一般列表生成式的嵌套循环顺序是从左至右的(→) 7.列表的深复制,Python列语言中函数参数是列表类型时,参数是按照引用方式传递的。因此可以如下这样做: >>> a = [1,2,3,4] >>> b = a[:] >>> b [1, 2, 3, 4] >>> c = a >>> a[0] = 98 >>> a [98, 2, 3, 4] >>> c [98, 2, 3, 4] # c随着a的值改变而改变,因为c和a指向同一个区域 >>> b [1, 2, 3, 4] # b并不改变,因为其新开辟了一块内存区域,使得b指向它

8.numpy的切片复制和深复制,以及布尔型索引

<1>由第7点可知,python的列表切片可以深复制,但是numpy的切片只能浅复制,如:

In [1]: a Out[2]: [1, 2, 3, 4]

In [3]: a = np.array(a)# 开辟一块内存存储数组a的值 In [4]: a Out[5]: array([1, 2, 3, 4]) In [6]: b = a[:] # 试图复制a的值,其实这只是引用 In [7]: b Out[8]: array([1, 2, 3, 4]) In [9]: b[1]=99 In [10]: b Out[11]: array([ 1, 99,  3,  4]) In [12]: a Out[13]: array([ 1, 99,  3,  4]) # 注意看此处,a的值也改变了,说明这种方式只是引用,不是真的复制

<2>如果使用copy方法,就是深复制了,如:

In [16]: a Out[16]: array([ 1, 99,  3,  4]) In [17]: c = a.copy() In [18]: c Out[18]: array([ 1, 99,  3,  4]) In [19]: c[0]=76 In [20]: c Out[20]: array([76, 99,  3,  4]) In [21]: a Out[21]: array([ 1, 99,  3,  4]) # c的改变并不影响到a的值

<3>再来看看布尔型索引,也不会改变原值,如:

In [21]: a Out[21]: array([ 1, 99,  3,  4]) In [22]: d = a[a!=99] # 布尔型索引,得到a数组中不等于99的值,a!=99返回的是array([ True, False,  True,  True], dtype=bool) In [23]: d Out[23]: array([1, 3, 4]) In [24]: d[2] = 52 # 改变d数组中的值 In [25]: d Out[25]: array([ 1,  3, 52]) In [26]: a Out[26]: array([ 1, 99,  3,  4]) # 发现a数组并不受影响,可以知道布尔型索引会重新开辟一块内存再存储d数组,而不再是指向原来的a。

<4>布尔型索引还可以是多种条件的组合,通过(&或者是|来连接)如:

In [28]: a Out[28]: array([ 1, 99,  3,  4])

In [29]: e = a[(a!=99) & (a!=3)]# 记得括号

In [30]: e Out[30]: array([1, 4])

总结:一维数组的索引与切片和Python列表的功能类似,区别在于,数组切片是原始数组的视图,这意味着数据不会被复制,对视图的任何修改都会直接反映到原数组上。NumPy如此设计的目的是为了处理大数据,如果采取复制的方法可能产生性能和内存的问题。如果一定要复制可以使用copy方法显式的复制。通过布尔型索引选取数组中的数据,将总是创建副本,即使返回一模一样的数组。

9.numpy模块里的axis后面的值是指定一个轴做运算 10.numpy.newaxis   从字面上是插入新的维度的意思 >>> b = np.array([1, 2, 3]) >>> b[np.newaxis] array([[1, 2, 3])   看一下转置的时候有什么区别 >>> np.transpose(b) array([1, 2, 3]) >>> np.transpose(c) array([[1],        [2],        [3]]) 11.关于创建array数据时,类型的重要性!!     ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。     在创建数组时,要么手动指定数据类型,要么np.array会尝试为新建的这个数组推断出一个较为合适的数据类型。     若是把一个包含字符,整型数据的列表转化成array数组,并且没有手动指定数据类型,则会自动变成字符型array。     解决办法:     可以手动指定object类型,依然保持原因数据类型不变,因为这些字符型和整型本身都是object类型。 12.numpy数据类型转换时报出这样的错误: ---ValueError: setting an array element with a sequence. ---这表示数组内数据维度不统一,故无法转换数据类型。也就是出现这样的[[1,2],[3,4,5]] 13.一定范围内索引 <方法1>可以生成一个和arr相同大小的数组,然后首先通过一次筛选找到大于3的元素对应索引的数组,继而对刚刚得到的数据再次筛选小于10的元素,最终得到想要的结果. <方法2>还可以通过两次进行筛选,分别筛选出大于3的元素和小于100的元素对应的索引数组,然后两个数组做交集处理,在numpy中有一个intersect1d函数可以进行这样的运算。---numpy.intersect1d(x,y)就是计算x and y的公共元素

14.numpy最大值索引

numpy.argmax(a, axis=None, out=None) 

返回沿轴axis最大值的索引。

Parameters:  a : array_like  数组  axis : int, 可选  默认情况下,索引的是平铺的数组,否则沿指定的轴。  out : array, 可选  如果提供,结果以合适的形状和类型被插入到此数组中。  Returns:  index_array : ndarray of ints  索引数组。它具有与a.shape相同的形状,其中axis被移除。  例子:

>>> a = np.arange(6).reshape(2,3) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> np.argmax(a) 5 >>> np.argmax(a, axis=0)#0代表列 array([1, 1, 1]) >>> np.argmax(a, axis=1)#1代表行 array([2, 2]) >>> >>> b = np.arange(6) >>> b[1] = 5 >>> b array([0, 5, 2, 3, 4, 5]) >>> np.argmax(b) # 只返回第一次出现的最大值的索引 1 1234567891011121314151617 1234567891011121314151617
转载请注明原文地址: https://www.6miu.com/read-30676.html

最新回复(0)