程序猿的机器学习之路-1-Numpy基础:创建多维数组
2017-01-01 08:49
621 查看
Numpy是python科学计算的核心库之一,主要提供了对多维数组的强有力支持。
概念:
1. axes(轴):数组的维度统称为轴。
2. rank:轴的数量称为rank。
举例:一维数组[1,2,1],就是一个rank为1的数组,因为它只有一个轴(一维)。下图显示的是一个rank为2(二维)的数组。它的第一个轴(维)的长度是2,如红色线框所示;第二个轴(维)的长度是3,如蓝色线框所示。这个有点像数据结构里说的:数组的元素本身也可以是数组类型一样,无限扩展下去。
ndarray(numpy.array)的主要属性:
这里插播一下:
Anaconda是一个基于Python的Data Science Platform,相当于一个包装了数据分析常用库和工具的软件。它是我们开始学习的一个好帮手。下载地址:https://www.continuum.io/anaconda-overview
安装好后,打开“IPython”,或者“Jupyter QtConsole”,或者“Spyder”都可以。它们本质上都是对IPython这个交互式环境的包装。
练习:创建一个ndarray。
直接使用numpy.array()方法,参数为python的 list or tuple (sequence type)。下面的代码里,“In”是我们输入的代码,“Out”是上一行代码的输出。不是每一行代码都会有输出哦。
代码:
下面这张图是在“Spyder”里执行上面代码的效果图:
双击上图中的变量查看窗口(Variable explorer)里的ndarray,可以看到一个二维数组的展示图:
numpy提供了另外一种快速创建ndarray的方法,尤其适合数组内容未知的情况,同时也避免了数组增长过程中的开销
API链接:numpy.ndarray.reshape
注意:新的形状必需保持size相同,直白一点,就是第一个shape的参数,3x4=12,需要和第二个shape的参数2x6=12,始终保持一致。
在numpy里,我们会见到random,ranf,sample这几个方法,其实它们全部都是numpy.random.random_sample这个方法的别名,都是基于“均匀分布”产生随机数。下面的代码验证了这一点:
详细介绍下用的最多一个numpy.random.random(API)。它随机返回半开区间[0.0, 1.0)的浮点数,方法参数只有一个:
size : int或者int型元组,也是返回数组的shape。如果输入的是(2,3,5),则首先抽取2x3x5=30个随机数,然后形成一个形状为(2,3,5)的多维数组作为返回值。如果没有提供参数,则直接返回一个随机数。
练习:生成[12, 30)区间的一个6x3的数组
代码:
好了,关于numpy第1讲就到这里,还有很多内容待后面用到的时候又再介绍。想马上深入了解的小伙伴可以到官网上看看:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
什么是多维数组?
核心对象是同型的多维数组(简单理解就是一个表格,通常内容都是些数字),具有相同的数据类型。概念:
1. axes(轴):数组的维度统称为轴。
2. rank:轴的数量称为rank。
举例:一维数组[1,2,1],就是一个rank为1的数组,因为它只有一个轴(一维)。下图显示的是一个rank为2(二维)的数组。它的第一个轴(维)的长度是2,如红色线框所示;第二个轴(维)的长度是3,如蓝色线框所示。这个有点像数据结构里说的:数组的元素本身也可以是数组类型一样,无限扩展下去。
Numpy里的多维数组:ndarray
Numpy的数组类numpy.array一般称呼为ndarray,这么叫主要是为了和Python的数组类
array.array区分开来。后面的文章里,如无特殊说明的地方,array和ndarray均是指的
numpy.array。
ndarray(numpy.array)的主要属性:
属性 | 说明 |
---|---|
ndim | 数组的轴数(维度) |
shape | shape是一个python的元组类型,其中每个数字分别表示的是各个轴(维)上数组的长度 |
size | 多维数组里全部元素的总数(等于shape元组里所有数值的乘积) |
dtype | 多维数组里元素的类型。同一个多维数组里所有的元素都是同一种类型 |
Anaconda是一个基于Python的Data Science Platform,相当于一个包装了数据分析常用库和工具的软件。它是我们开始学习的一个好帮手。下载地址:https://www.continuum.io/anaconda-overview
安装好后,打开“IPython”,或者“Jupyter QtConsole”,或者“Spyder”都可以。它们本质上都是对IPython这个交互式环境的包装。
练习:创建一个ndarray。
直接使用numpy.array()方法,参数为python的 list or tuple (sequence type)。下面的代码里,“In”是我们输入的代码,“Out”是上一行代码的输出。不是每一行代码都会有输出哦。
代码:
In [1]: import numpy as np In [2]: data = [[0,1,2,3,4], [5,6,7,8,9], [10,11,12,13,14]] In [3]: ndarray = np.array(data) In [4]: data Out[4]: [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] In [5]: ndarray Out[5]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) In [6]: ndarray.ndim Out[6]: 2 In [7]: ndarray.shape Out[7]: (3L, 5L) In [8]: ndarray.size Out[8]: 15 In [9]: ndarray.dtype Out[9]: dtype('int32')
下面这张图是在“Spyder”里执行上面代码的效果图:
双击上图中的变量查看窗口(Variable explorer)里的ndarray,可以看到一个二维数组的展示图:
创建ndarray的一些其它方法
zeros,ones和empty方法
numpy.zeros numpy.ones numpy.empty
numpy提供了另外一种快速创建ndarray的方法,尤其适合数组内容未知的情况,同时也避免了数组增长过程中的开销
In [1]: import numpy as np In [2]: d1 = np.zeros((2, 4)) In [3]: d1 Out[3]: array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) In [4]: d1.dtype Out[4]: dtype('float64') In [5]: d2 = np.ones((3, 4), dtype = np.int16) # 定义的时候可以直接指定数据类型 In [6]: d2 Out[6]: array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], dtype=int16) In [7]: d3 = np.empty((2, 4)) # 内容由内存在运行时的情况决定,这里 # 我的机器此时产生的结果全是零值 In [8]: d3 Out[8]: array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.]])
arange方法
arange可以返回一个平均分布的ndarray(numpy.array)。可以分别设置开始(可选),结束(必填)和间距(可选)。下面的示例非常清楚的展示了该方法的使用。In [1]: import numpy as np In [2]: d1 = np.arange(9) In [3]: d1 Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8]) In [4]: d2 = np.arange(4, 9) In [5]: d2 Out[5]: array([4, 5, 6, 7, 8]) In [6]: d3 = np.arange(1, 30, 5) In [7]: d3 Out[7]: array([ 1, 6, 11, 16, 21, 26])
reshape方法
顾名思义,此方法是将一个已经存在了的ndarray,转换为另外一个shape(形状,即数组各个轴上的长度)的多维数组。新数组包含了原来所有的数据。API链接:numpy.ndarray.reshape
In [1]: import numpy as np In [2]: ndarray = np.arange(0, 12).reshape((3, 4)) In [3]: ndarray Out[3]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) In [4]: newArray = ndarray.reshape((2, 6)) In [5]: newArray Out[5]: array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]])
注意:新的形状必需保持size相同,直白一点,就是第一个shape的参数,3x4=12,需要和第二个shape的参数2x6=12,始终保持一致。
random方法
用随机数填充新数组的内容。numpy里有多个产生数据数组的方法,容易搞晕。产生随机数目前我见到两大类,一类是按照“均匀分布”(例如概率论里的“0-1连续分布”)产生,另一类是按照“正态分布”产生的。在numpy里,我们会见到random,ranf,sample这几个方法,其实它们全部都是numpy.random.random_sample这个方法的别名,都是基于“均匀分布”产生随机数。下面的代码验证了这一点:
In [1]: np.random.random Out[1]: <function random_sample> In [2]: np.random.ranf Out[2]: <function random_sample> In [3]: np.random.sample Out[3]: <function random_sample> In [4]: np.random.random_sample is np.random.random Out[4]: True In [5]: np.random.random_sample is np.random.ranf Out[5]: True In [6]: np.random.random_sample is np.random.sample Out[6]: True
详细介绍下用的最多一个numpy.random.random(API)。它随机返回半开区间[0.0, 1.0)的浮点数,方法参数只有一个:
size : int或者int型元组,也是返回数组的shape。如果输入的是(2,3,5),则首先抽取2x3x5=30个随机数,然后形成一个形状为(2,3,5)的多维数组作为返回值。如果没有提供参数,则直接返回一个随机数。
练习:生成[12, 30)区间的一个6x3的数组
代码:
In [5]: a = (30 - 12) * np.random.random((6, 3)) + 12 In [6]: a Out[6]: array([[ 23.55939316, 15.29964052, 24.83744712], [ 20.94592111, 16.66642526, 28.13197345], [ 22.69375937, 24.1361419 , 14.08901587], [ 18.16682627, 17.11927236, 13.46281086], [ 29.31224865, 21.68254748, 23.21431569], [ 21.3744623 , 27.10697881, 14.91690164]])
好了,关于numpy第1讲就到这里,还有很多内容待后面用到的时候又再介绍。想马上深入了解的小伙伴可以到官网上看看:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
相关文章推荐
- NumPy 创建多维数组
- NumPy基础 -- 1. ndarray (多维数组对象)
- numpy基础入门-多维数组对象
- NumPy(1)简介,基础属性,数组创建(ones,zeros,empty,arange,linespace)
- c++ 多维数组创建
- Java数组声明、创建、初始化基础
- C程序设计基础之多维数组的指针变量
- 动态创建多维数组的方法
- 使用 ASP.NET 创建 XML Web services 不支持多维数组
- Numpy 数组创建 (三)
- PHP基础/URL 传递多维数组
- c++ 动态创建多维数组
- Java编程那些事儿48—多维数组基础
- C++ 用new 动态创建多维数组
- 一个关于用Array.newInstance方式创建多维数组的问题
- 动态创建多维数组——才不简单
- JAVA基础之一维数组和多维数组
- [基础]php递归将多维数组转换为一维数组
- CodeDom.CodeArrayCreateExpression不能生成多维数组的创建表达式
- 动态创建多维数组