numpy 笔记

来源:互联网 发布:越前南次郎的实力数据 编辑:程序博客网 时间:2024/05/18 19:37
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)>>> aarray([[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>>> barray([0, 5, 2, 3, 4, 5])>>> np.argmax(b) # 只返回第一次出现的最大值的索引1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
























0 0
原创粉丝点击