NumPy

NumPy的ndarray

ndarray作为NumPy中最重要的特点,你可以利用这个对数组进行数学运算。
下面来看一个简单的例子

In [1]: import numpy as np

In [2]: data  = [1, 2, 3, 4, 5]  # 创建一个普通的数组

In [3]: data2  = np.array(data) # 通过np.array函数把data转为ndarray对象
In [4]: data2
Out[4]: array([1, 2, 3, 4, 5])

In [5]: data
Out[5]: [1, 2, 3, 4, 5]  # 粗略一看发现没什么特别大的区别

继续往下看

In [6]: data2 * 10
Out[6]: array([10, 20, 30, 40, 50])  # ndarray可以很方便的对数组中的每个元素进行数学计算

当然它也可以对多维数组进行运算

In [19]: data = [[1, 2, 3, 4, 5],[5, 4, 3, 2, 1]]

In [20]: data2 = np.array(data)  # 发现创建ndarray的过程太过麻烦,有没有更简便点的(继续往下看)

In [21]: data2 * 10
Out[21]:
     array([[10, 20, 30, 40, 50],
       [50, 40, 30, 20, 10]])

In [22]: data2 + data2
Out[22]:
      array([[ 2,  4,  6,  8, 10],
        [10,  8,  6,  4,  2]])

In [23]:

常用的几种创建ndarray方式

In [25]: np.zeros(5)
Out[25]: array([0., 0., 0., 0., 0.])

有创建全是0的数组,当然也可以创建全1的数组

In [13]: np.ones(5)
Out[13]: array([1., 1., 1., 1., 1.])

如果想要创建多维数组的话,在参数中传入一个元组即可,例如

In [26]: np.zeros((3,2))
Out[26]:
array([[0., 0.],
       [0., 0.],
       [0., 0.]])

同样,python中的range在NumPy中也有类似的函数

In [3]: np.arange(10)
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

这里分享一个不常用但是很有趣的一个函数eye,它能够创建一个正方的N×N的矩阵,对角线为1其余为0的一个数组,它的方程式为
numpy.eye(N,M=None, k=0, dtype=<type 'float'>)

In [7]: np.eye(10)
Out[7]:
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

方程式中的k决定了对角线1的起始点,如果为正整数则往右移,如果为负整数则往下移

In [14]: np.eye(10, dtype=int, k=2)  #在这里k为2,对角线1往右移动了2个单位
Out[14]:
array([[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
In [15]: np.eye(10, dtype=int, k=-2)  #如果为-2,则对角线往下移动了2个单位
Out[15]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])

ndarray的数据类型dtype

数据类型dtype是一个特殊的对象,它们会直接映射到相应的机器上来表示,这样使得我们在以后操作大数据集的读写上数据类型显得尤为重要。

NumPy中常见的数据类型,括号中为类型代码

  • int8(i1) 有符号和无符号的8位整型
  • int16(i2) 有符号和无符号的16位整型
  • int32(i4) 有符号和无符号的32位整型
  • int64(i8) 有符号和无符号的64位整型
  • float16(f2) 半精度浮点数
  • float32(f4或f) 标准的单精度浮点数
  • float64(f8或d) 标准的双精度浮点数
  • bool(?) 存储True和False的布尔值
  • Object(O) python对象
  • string_(S) 固定长度的字符串类型,如创建一个长度为10的字符串,应使用S10

下面简单看几个例子

In [21]: arr1 = np.array([1,2,3],dtype=np.float64)

In [22]: arr1.dtype
Out[22]: dtype('float64')
In [21]: arr1 = np.array([1,2,3],dtype='d') #直接通过类型代码来表示数据类型更为简洁

In [22]: arr1.dtype
Out[22]: dtype('float64')
In [23]: arr = np.array(['Bob','Jams','Wiliam','Joe'],dtype=np.string_)

In [24]: arr.dtype
Out[24]: dtype('S6')

数据类型的转换

我们可以通过ndarray的astype方法来转换其dtype

In [25]: arr = np.array([1, 2, 3])

In [26]: arr.dtype
Out[26]: dtype('int64')

In [27]: arr2 = arr.astype(np.float64)

In [28]: arr2.dtype
Out[28]: dtype('float64')

In [29]: arr2
Out[29]: array([1., 2., 3.])

总结

今天学习了NumPy中ndarray的几种常见的创建方式,可以将Python的array通过NumPy下的array函数来转换,也可以通过NumPy的zeros、empty、ones等函数来创建。了解了ndarray中比较常见的数据类型,数据类型在未来做大数据集中十分重要,它直接影响到数据的读写速度和内存大小等问题,这一点千万不能忽视。