您的位置:首页 > 编程语言 > Python开发

程序猿的机器学习之路-1-Numpy基础:创建多维数组

2017-01-01 08:49 621 查看
Numpy是python科学计算的核心库之一,主要提供了对多维数组的强有力支持。

什么是多维数组?

核心对象是同型的多维数组(简单理解就是一个表格,通常内容都是些数字),具有相同的数据类型。

概念:

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数组的轴数(维度)
shapeshape是一个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.randomAPI)。它随机返回半开区间[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息