numpy是一个python和矩阵相关的库,在机器学习中非常有用,记录下numpy的基本用法

numpy的数组类叫做ndarray也叫做数组,跟python标准库中的array.array不同,后者只处理一维的数组而且提供很少的函数,numpy中有更多重要的属性

分别是

ndarray.ndim    该数组的维度,轴的数量

ndarray.shape    该数组的尺寸二维数组(m, n)m行n列,如果是三维或者以上的会包含其维度即(维度,m,n)

ndarray.size    数组中所有元素的数量

ndarray.dtype    数组中元素的类型

ndarray.itemsize 数组中每个元素的字节大小,float64中此项为64/8,int32中此项为32/8

ndarray.data    数组中包含的数据的缓冲区,一般不使用,都是使用索引来访问元素

数组的创建

np.array([2,3,4])

np.array([[2,3,4],[3,4,5]], dtype=np.int32)

np.zeros((3,4))创建一个全零的3*4数组

np.ones(3,4)创建一个全一的3*4数组

np.empty((2,3))创建一个数组,初始内容随机,取决内存的状态,默认创建的数组类型为float64

使用arange函数可以创建一个序列,类似于列表的数组

np.arange(10, 30, 5)从10到30以5为步长创建一个数组

如果不知道步长的话可以使用linspace

np.linspace(0,2,9)从0到2平均产生9个数

reshape函数可以将数组转换成指定维度,行,列的数组

np.arange(100).reshape(10,10)将一个一维的0-99的数组转换为10个0-9的数组

基础的操作

>>> a = np.array( [,,,] )
>>> b = np.arange( )
>>> b
array([, , , ])
>>> c = a-b
>>> c
array([, , , ])
>>> b**
array([, , , ])
>>> *np.sin(a)
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
>>> a<
array([ True, True, False, False], dtype=bool)

两个矩阵相乘,使用dot函数,如果使用*结果是元素相应位置的元素相乘,不符合矩阵乘法

>>> A = np.array( [[,],
... [,]] )
>>> B = np.array( [[,],
... [,]] )
>>> A*B # elementwise product
array([[, ],
[, ]])
>>> A.dot(B) # matrix product
array([[, ],
[, ]])
>>> np.dot(A, B) # another matrix product
array([[, ],
[, ]])

使用+=或者*=会修改已经存在的数组而不是创建一个新的数组

sum函数计算数组总和

min函数求最小

max函数求最大

如果想求行中总和或者列中总和可以使用axis参数

sum(axis=0)求列总和,axis=1求行总和

max,min类似

>>> b = np.arange().reshape(,)
>>> b
array([[ , , , ],
[ , , , ],
[ , , , ]])
>>>
>>> b.sum(axis=) # sum of each column
array([, , , ])
>>>
>>> b.min(axis=) # min of each row
array([, , ])
>>>
>>> b.cumsum(axis=) # cumulative sum along each row
array([[ , , , ],
[ , , , ],
[ , , , ]])

numpy提供了常用的数学函数,sin,cos,exp等

一维数组可以被索引,切片,迭代,就像其他和列表一样的python序列一样

>>> a = np.arange()**
>>> a
array([ , , , , , , , , , ])
>>> a[] >>> a[:]
array([ , , ])
>>> a[::] = - # equivalent to a[::] = -; from start to position , exclusive, set every 2nd element to -
>>> a
array([-, , -, , -, , , , , ])
>>> a[ : :-] # reversed a
array([ , , , , , -, , -, , -])
>>> for i in a:
... print(i**(/.))
...
nan
1.0
nan
3.0
nan
5.0
6.0
7.0
8.0
9.0

多维数组每个轴有一个索引,这些索引以逗号分隔的元组给出

>>> def f(x,y):
... return *x+y
...
>>> b = np.fromfunction(f,(,),dtype=int)
>>> b
array([[ , , , ],
[, , , ],
[, , , ],
[, , , ],
[, , , ]])
>>> b[,] >>> b[:, ] # each row in the second column of b
array([ , , , , ])
>>> b[ : ,] # equivalent to the previous example
array([ , , , , ])
>>> b[:, : ] # each column in the second and third row of b
array([[, , , ],
[, , , ]])

当提供的索引数量少于轴(维)数,缺少的索引被当做完整的切片

b[-1]=b[-1, :]即取出最后一行的所有元素

对多维数组来说,迭代只迭代一个(轴)维度

>>> for row in b:
... print(row)
...
[ ]
[ ]
[ ]
[ ]
[ ]

如果要获取所有元素

>>> for element in b.flat:
... print(element)
...

连接不同的数组

np.vstack()添加到下一行

np.hstack()添加到同行尾部

>>> a = np.floor(*np.random.random((,)))
>>> a
array([[ ., .],
[ ., .]])
>>> b = np.floor(*np.random.random((,)))
>>> b
array([[ ., .],
[ ., .]])
>>> np.vstack((a,b))
array([[ ., .],
[ ., .],
[ ., .],
[ ., .]])
>>> np.hstack((a,b))
array([[ ., ., ., .],
[ ., ., ., .]])

分离数组元素

np.hsplit()

np.vsplit()

>>> a = np.floor(*np.random.random((,)))
>>> a
array([[ ., ., ., ., ., ., ., ., ., ., ., .],
[ ., ., ., ., ., ., ., ., ., ., ., .]])
>>> np.hsplit(a,) # Split a into
[array([[ ., ., ., .],
[ ., ., ., .]]), array([[ ., ., ., .],
[ ., ., ., .]]), array([[ ., ., ., .],
[ ., ., ., .]])]
>>> np.hsplit(a,(,)) # Split a after the third and the fourth column
[array([[ ., ., .],
[ ., ., .]]), array([[ .],
[ .]]), array([[ ., ., ., ., ., ., ., .],
[ ., ., ., ., ., ., ., .]])]

数组的复制和查看

当操作和操作数组时,他们的数据有时会被复制到一个新的数组中,这通常是初学者混淆的来源。有三种情况

>>> a = np.arange()
>>> b = a # no new object is created
>>> b is a # a and b are two names for the same ndarray object
True
>>> b.shape = , # changes the shape of a
>>> a.shape
(, )

赋值语句并不等于创建一个新的数组,而是对旧数组的引用

查看与浅拷贝

不同的数组对象可以享有相同的数据,view方法可以创建一个新的数组对象拥有相同的数据

>>> c = a.view()
>>> c is a
False
>>> c.base is a # c is a view of the data owned by a
True
>>> c.flags.owndata
False
>>>
>>> c.shape = , # a's shape doesn't change
>>> a.shape
(, )
>>> c[,] = # a's data changes
>>> a
array([[ , , , ],
[, , , ],
[ , , , ]])

对数组切片返回一个数组的view

>>> s = a[ : , :]     # spaces added for clarity; could also be written "s = a[:,1:3]"
>>> s[:] = # s[:] is a view of s. Note the difference between s= and s[:]=
>>> a
array([[ , , , ],
[, , , ],
[ , , , ]])

view和切片得到的数组如果改变,源数组也会改变

copy方法会复制完整的数据和其数据

>>> d = a.copy()                          # a new array object with new data is created
>>> d is a
False
>>> d.base is a # d doesn't share anything with a
False
>>> d[,] =
>>> a
array([[ , , , ],
[, , , ],
[ , , , ]])

参考自官方文档

https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

python numpy学习记录的更多相关文章

  1. Python NumPy学习总结

    一.NumPy简介 其官网是:http://www.numpy.org/ NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.Num ...

  2. Python爬虫学习记录【内附代码、详细步骤】

    引言: 昨天在网易云课堂自学了<Python网络爬虫实战>,视频链接 老师讲的很清晰,跟着实践一遍就能掌握爬虫基础了,强烈推荐! 另外,在网上看到一位学友整理的课程记录,非常详细,可以优先 ...

  3. python爬虫学习记录

    爬虫基础 urllib,urllib2,re都是python自带的模块 urllib,urllib2区别是urllib2可以接受一个Request类的实例来设置url请求的headers,即可以模拟浏 ...

  4. python numpy 学习

    例子 >>> import numpy as np >>> a = np.arange(15).reshape(3, 5) >>> a array ...

  5. 简明 Python 教程--学习记录

    注意,我们在print语句的结尾使用了一个 逗号 来消除每个print语句自动打印的换行符.这样做有点难看,不过确实简单有效. print # prints a blank line 注意,没有返回值 ...

  6. python多线程学习记录

    1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...

  7. Python numpy学习笔记(一)

    下边代码是关于numpy的一些基本用法,包括数组和矩阵操作等... import numpy as np print "<== print version ==>" p ...

  8. Python tkinter 学习记录(一) --label 与 button

    最简的形式 from tkinter import * root = Tk() # 创建一个Tk实例 root.wm_title("标题") # 修改标题 root.mainloo ...

  9. python爬虫学习记录——各种软件/库的安装

    Ubuntu18.04安装python3-pip 1.apt-get update更新源 2,ubuntu18.04默认安装了python3,但是pip没有安装,安装命令:apt install py ...

随机推荐

  1. http跟https的区别

    http: Hypertext transform protocol 超文本传输协议 是一个为了传输超媒体文档(比如html)的应用层协议 是为了web的浏览器跟web的server端的交流而设计的, ...

  2. 【转载】 ftp 命令行

    原文在这里. 本文中,介绍在 Linux shell 中如何使用 ftp 命令.包括如何连接 FTP 服务器,上传或下载文件以及创建文件夹.尽管现在有许多不错的 FTP 桌面应用,但是在服务器.SSH ...

  3. 使用kubeadm安装k8s集群故障处理三则

    最近在作安装k8s集群,测试了几种方法,最终觉得用kubeadm应该最规范. 限于公司特别的网络情况,其安装比网上不能访问google的情况还要艰难. 慢慢积累经验吧. 今天遇到的三则故障记下来作参考 ...

  4. 【JBPM4】任务节点-任务分配assignee

    JPDL <process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl&quo ...

  5. AC日记——[SDOI2017]树点涂色 bzoj 4817

    4817 思路: 跪烂大佬 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500005 struct Tre ...

  6. (1)go 环境搭建

    1 .下载安装 https://golang.org/ 2.环境变量配置 安装后会自动配置三个环境变量 (1) GOROOT: (2) PATH: (3) GOPATH GOPATH 从1.8开始,w ...

  7. HDU 4863 Centroid of a Tree

    树的重心,树形$dp$,背包. 树的重心有两个充分必要条件: $1$.某树有两个重心$a$,$b$ $<=>$ $a$与$b$相邻,断开$a$与$b$之间的边之后,两个联通分量内的点的个数 ...

  8. HDU 6118 2017百度之星初赛B 度度熊的交易计划(费用流)

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. HDU 5861 Road(线段树 区间修改 单点查询)

    Road Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  10. 【剑指offer】顺时针打印数组

    顺时针打印数组 题意 例如我们有一个二维数组,如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 现在要按照顺时针打印出来,结果应该为: 1 2 3 4 8 12 16 ...