商业数据分析之可视化绘图 1.4:Numpy介绍与基础操作

Numpy 的官网 https://numpy.org

Numpy的练习题 https://github.com/rougier/numpy-100

NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。 大多数提供科学计算的包都是用NumPy的阵列作为构建基础。

NumPy的主要对象是多维数组(multidimensional array)。 数组有时也翻译为阵列,它具有相同类型的元素(通常为数字),使用非负整数索引( index)。 在NumPy中维度称为轴(Axes)。

处理数据时,通常需要使用多维数组的方法,有时还必须对该数据应用一些基本的数学和统计运算,这正是NumPy定位的地方。 另外,针对大型n维数组也提供许多高级数学和统计运算支持。

NumPy的数组称为ndarray(N-dimensional array)。 请注意,numpy的array与Python库中的array不同,后者仅处理一维数组且功能较少。

这些ndarray是NumPy的本质,使它比使用Python的内置数组更快。 由于它们是同类型的,这意味着所有元素都必须是同一类型,因此数据具有一致性,这导致更少的内存浪费和更好的时间效率。

另外,NumPy数组具有「已定义」数据类型。 这意味着无法将字符串插入整数类型数组。 NumPy通常与双精度数据类型一起使用。

例如,一个简单的数组,3D空间中的点的坐标[1, 2, 4]只有一个轴。 该轴上有3个元素,所以我们说它的长度为3。 二维数组会有2个轴,例如第一个维度的轴长度为2,第二个维度的轴长度为3。 如下图所示例子:

[[ 1, 0, 0],
 [ 0, 1, 2]]

ndarray内容如下:

ndarray.ndim:数组的轴数,例如: 一维数组轴数为 1,二维数组轴数为 2,三维的数组轴数则为3。

ndarray.shape:数组的维度。 对于具有n 列(rows)与m 行(columns)的矩阵,shape是(n, m)。

ndarray.size:数组元素的总数,等于的元素的乘积。

ndarray.dtype:描述数组中元素的类型,例如:numpy.int32,numpy.int16和numpy.float64。

ndarray.itemsize:数组中每个元素的大小(以字节为单位)。 例如,类型为float64具有itemsize8(= 64/8),而类型为complex32具有itemsize4(= 32/8)。

ndarray.data:包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

1. 一个简单例子

>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])>>> a.shape
(3, 5)>>> a.ndim
2>>> a.dtype.name
'int32'>>> a.itemsize   # 32/8
4>>> a.size
15>>> type(a)
<type 'numpy.ndarray'>

2. 创建数组

创建一维数组

>>> a = np.array([2, 3, 4])
>>> a
array([2, 3, 4])>>> a.ndim 
1>>> a.dtype
dtype('int32')>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')

常见的错误

>>> a = np.array(1, 2, 3, 4)    # WRONG
>>> a = np.array([1, 2 ,3, 4])  # RIGHT

创建二维数组

>>> b = np.array([(1.5, 2, 3), (4, 5, 6)])
>>> b
array([[ 1.5,  2. ,  3. ],
       [ 4. ,  5. ,  6. ]])>>> b.ndim
2>>> b.dtype
dtype('float64')

数组的类型也可以在创建时明确指定:

>>> c = np.array( [[1, 2], [3, 4]], dtype=complex )
>>> c
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]])

使用函数zeros会创建一个全零的数组,而函数ones则会创建全壹的数组。 默认情况下,创建的数组的dtype为 float64。

>>> np.zeros((3, 4))
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])# dtype can also be specified
>>> np.ones((2, 3, 4), dtype=np.int16 )     
array([[[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]],
       [[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]]], dtype=int16)

为了创建数字序列,NumPy提供了类似于range的方法来返回数组而不是用数组的函数 。

使用函数arrange范围设定10 ~ 30,数值间隔为5,注意数组的输出并不包含最后的30。

>>> np.arange(10, 30, 5)
array([10, 15, 20, 25])

也可以同时设定整数及浮点数的数值,最后格式都会转为浮点数格式。

# it accepts float arguments
>>> np.arange( 0, 2, 0.3 )                
array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])>>> d.dtype
dtype('float64')

3. 打印数组

打印一维、二维及三组数组。

>>> a = np.arange(6)                         # 1d array
>>> print(a)
[0 1 2 3 4 5]

>>> b = np.arange(12).reshape(4, 3)           # 2d array
>>> print(b)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

>>> c = np.arange(24).reshape(2, 3, 4)         # 3d array
>>> print(c)
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]
 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

4. 基本操作

>>> a = np.array([20, 30, 40, 50])
>>> a
array([20, 30, 40, 50])>>> b = np.arange(4)
>>> b
array([0, 1, 2, 3])>>> c = a  - b
>>> c
array([20, 29, 38, 47])>>> b**2
array([0, 1, 4, 9])>>> 10*np.sin(a)
array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])>>> a < 35
array([ True, True, False, False])

与许多矩阵语言不同,乘积运算符*在NumPy数组中按元素进行操作。 可以使用@运算符(在python> = 3.5中)或dot函数执行矩阵乘积:

>>> a = np.array( [[1,1],
...                [0,1]] )>>> b = np.array( [[2,0],
...                [3,4]] )>>> a * b                      # elementwise product
array([[2, 0],
       [0, 4]])>>> a @ b                      # matrix product
array([[5, 4],
       [3, 4]])

某些操作,例如(+=)和(*=)会修改现有数组,而不是创建一个新的数组。

>>> a = np.ones((2, 3), dtype=int)
array([[1, 1, 1],
       [1, 1, 1]])>>> b = ([1, 2, 3], [4, 5, 6])>>> a *= 3
>>> a
array([[3, 3, 3],
       [3, 3, 3]])>>> b += a
>>> b
array([[4, 5, 6],
       [7, 8, 9]])

通过axis参数,指定axis=1为row运算,axis=0为column运算。

>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> a.sum(axis=0)               # sum of each column
array([12, 15, 18, 21])

>>> a.min(axis=1)               # min of each row
array([0, 4, 8])>>> a.mean(axis=0)              # mean of each column
array([4., 5., 6., 7.])>>> a.mean(axis=1)              # mean of each row
array([1.5, 5.5, 9.5])>>> a.cumsum(axis=1)            # cumulative sum along each row
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]], dtype=int32)

5. 索引

一维数组的索引。

>>> a = np.arange(10)**3
>>> a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
# index( 0,   1,   2,   3,   4,   5,   6,   7,   8,   9)>>> a[2]
8>>> a[-1]
729>>> a[9]
729>>> a[2:5]
array([ 8, 27, 64])
# equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000
>>> a[:6:2] = -1000      >>> a
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])>>> a[ : :-1]             # reversed a
array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1, -1000])

多维数组每个轴可以有一个索引。

>>> def f(x, y):
...     return 10*x + y

>>> b = np.fromfunction(f, (5, 4), dtype=int)
>>> b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])>>> b[3, 1]
31>>> b[-1, -1]
43>>> b[0:5, 1]              # each row in the second column of b
array([ 1, 11, 21, 31, 41])>>> b[ : , 1]              # equivalent to the previous example
array([ 1, 11, 21, 31, 41])>>> b[1:3, : ]       # each column in the second and third row of b
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])>>>b[:2, :2]
array([[ 0,  1],
       [10, 11]])

6. 筛选

筛选是一个非常强大的工具,如果要避免出现异常值,可以使用它来清理数据,对于更好地了解数据也很有帮助。

>>> a = np.arange(10)**3
>>> a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])# values bigger than 10
>>> a[a > 10]                   
array([ 27,  64, 125, 216, 343, 512, 729], dtype=int32)

# alternative – values smaller than 3
>>>np.extract((a < 3), a)  
array([0, 1], dtype=int32)# values bigger 5 and smaller 10   
>>>a[(a > 5) & (a < 10)]
array([8], dtype=int32)# indices of values bigger than 5 (rows and cols) 
>>>np.where(a > 5)
(array([2, 3, 4, 5, 6, 7, 8, 9], dtype=int64),)

7. 排序

对数据集的每一行进行排序非常有用。 使用NumPy,我们还可以对其他维度(例如row)进行排序。

>>> c = ([8,5,7],[5,3,2])
>>> c
([8, 5, 7], 
 [5, 3, 2])>>>np.sort(c)          # values sorted on last axis
array([[5, 7, 8],
       [2, 3, 5]])>>>np.sort(c, axis=0)  # values sorted on axis 0
array([[5, 3, 2],
       [8, 5, 7]])

以上这些就是Numpy的基础介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值