numpy基础:数组与向量化计算

将NumPy用于数值计算的重要的原因之⼀,是它可以更高效地处理大量数组数据或者说是列表数据,这个“高效”既是处理速度上的高效也是处理能力上的高效。

举个例子比较NumPy与python内建序列对数据的处理速度:

import numpy as np
my_arr = np.arange(1000000)
my_list = list(range(1000000))

%time for _ in range(10): my_arr2 = my_arr * 2
%time for _ in range(10): my_list2 = [x * 2 for x in my_list]
------------------------------------------------------------------
Wall time: 14 ms
Wall time: 639 ms

一,NumPy的ndarray:多维数组对象

1,什么是ndarray

NumPy最重要的⼀个特点就是其N维数组对象,即ndarray,该对象是⼀个快速⽽灵活的⼤数据集容器。

可以⽤类似于标量的操作方法对整块数据执⾏⼀些数学运算。这显然让对数组的操作比对数学意义上的矩阵运算更加方便。

举个使用ndarray进行标量运算的例子:

import numpy as np
# 产生一组2*3的随机数据
data = np.random.randn(2, 3)
data
------------------------------------------------------------------
array([[ 1.18706826,  0.5465248 ,  0.22261032],
       [-1.17929644, -0.84965268, -1.75933023]])
==================================================================
# 进行运算
data * 10
data + data
------------------------------------------------------------------
[[ 11.87068257   5.46524801   2.22610324]
 [-11.79296442  -8.49652683 -17.59330234]]
[[ 2.37413651  1.0930496   0.44522065]
 [-2.35859288 -1.69930537 -3.51866047]]

ndarray中的所有元素必须是相同类型的。
每个数组都有⼀个shape表示各维度⼤⼩和⼀个dtype说明数组数据类型的对象。

# 查看属性
data.shape,  data.dtype
-------------------------------------------------------------------
((2, 3), dtype('float64'))

2,创建ndarray

1,array函数
创建数组最简单的办法就是使⽤array函数。 它接受⼀切序列型的对象, 然后产⽣⼀个新的含有传⼊数据的NumPy数组。

data = [[1,2,3,4], [5,6,7,8]]
arr = np.array(data)
arr
------------------------------------------------------------------
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])	

2,使用使用需指定参数的zeros、ones、empty函数

np.zeros(10)
np.ones((3, 6))
np.empty((2, 2, 2), dtype=int) # 返回了一堆未初始化的垃圾值,所以empty不安全
--------------------------------------------------------------------
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
array([[1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.]])
array([[[7536735, 6684783],
        [7798900, 7471201]],

       [[6029413, 7209025],
        [7274595, 6553710]]])

3,当然还有其他函数
NumPy manual contents:Array Creation

3,数据类型

如前文所示,可用dtype来显示或指定ndarry的数据类型。它是numpy你能与其他系统数据进行交互的原因。

data = [[1,2,3,4], [5,6,7,8]]
arr = np.array(data)
arr.dtype
-------------------------------------------------------------------
dtype('int32')

也可用astype更显式地指定数据类型:

float_arr = arr.astype(np.float64)
float_arr.dtype
----------------------------------------------------------------
dtype('float64')

4,NumPy数组的运算

NumPy可对全量数组进行计算而不需要编写python循环,称这种特性为“向量化”。它将等大小数组的标量操作作用到数组的每一个元素。

arr
-------------------------------------------------------------------
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
===================================================================
arr * arr
-------------------------------------------------------------------
array([[ 1,  4,  9, 16],
       [25, 36, 49, 64]])
===================================================================
arr + arr
-------------------------------------------------------------------
array([[ 2,  4,  6,  8],
       [10, 12, 14, 16]])
===================================================================
arr / 2
-------------------------------------------------------------------
array([[0.5, 1. , 1.5, 2. ],
       [2.5, 3. , 3.5, 4. ]])
===================================================================
arr ** 2
-------------------------------------------------------------------
array([[ 1,  4,  9, 16],
       [25, 36, 49, 64]], dtype=int32)
===================================================================
arr2 = (arr ** 2) - 2
arr2
-------------------------------------------------------------------
array([[-1,  2,  7, 14],
       [23, 34, 47, 62]], dtype=int32)
===================================================================
arr2 >= arr
-------------------------------------------------------------------
array([[False,  True,  True,  True],
       [ True,  True,  True,  True]])
===================================================================

5,基础索引与切片

NumPy有多种方式让使用者能从数组中选择子集。
1,一维数组与列表类似

arr = np.arange(8)
arr
-------------------------------------------------------------------
array([0, 1, 2, 3, 4, 5, 6, 7])
===================================================================
arr[-1]
-------------------------------------------------------------------
7
===================================================================
arr[0: 3]
-------------------------------------------------------------------
array([0, 1, 2])
===================================================================
arr[2: -2]
-------------------------------------------------------------------
array([2, 3, 4, 5])
===================================================================

-------------------------------------------------------------------

===================================================================

-------------------------------------------------------------------

===================================================================

-------------------------------------------------------------------

===================================================================

-------------------------------------------------------------------

===================================================================

-------------------------------------------------------------------

===================================================================

-------------------------------------------------------------------

===================================================================

但一维数组切片的操作结果与python内建list的有所不同:

li = [0, 1, 2, 3, 4, 5, 6, 7]
li[0: 3] = 666
li
-------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-43-874b07fe6728> in <module>
      1 li = [0, 1, 2, 3, 4, 5, 6, 7]
----> 2 li[0: 3] = 666
      3 li

TypeError: can only assign an iterable
===================================================================
arr[0: 3] = 666
arr
-------------------------------------------------------------------
array([666, 666, 666,   3,   4,   5,   6,   7])
===================================================================
split_ = arr[0: 3] 
split_[0] = 2333
split_
-------------------------------------------------------------------
array([2333,  666,  666])
===================================================================
arr
-------------------------------------------------------------------
array([2333,  666,  666,    3,    4,    5,    6,    7])
===================================================================
  • 这就体现了NumPy数组向量化特性
  • NumPy数组的切片是原数组的真实视图,所有对切片的操作都会作用于原数组,这就是它与list的不同

2,多维数组与C语言的多维数组类似

arr = np.array([
                    [
                        [111, 2222, 2222222],
                        [333, 4444, 4444444]
                    ],
                    [
                        [555, 6666, 6666666],
                        [777, 8888, 7777777]
                    ],
                    [
                        [999, 1010, 8888888],
                        [111, 1212, 9999999]
                    ]
               ])
arr
-------------------------------------------------------------------
array([[[    111,    2222, 2222222],
        [    333,    4444, 4444444]],

       [[    555,    6666, 6666666],
        [    777,    8888, 7777777]],

       [[    999,    1010, 8888888],
        [    111,    1212, 9999999]]])
===================================================================
arr[1]
-------------------------------------------------------------------
array([[    555,    6666, 6666666],
       [    777,    8888, 7777777]])
===================================================================
arr[1][1]
-------------------------------------------------------------------
array([[    555,    6666, 6666666],
       [    777,    8888, 7777777]])
===================================================================
arr[1][1][1] # 等效arr[1, 1, 1]
-------------------------------------------------------------------
8888
===================================================================
arr2 = arr[0: 2]
arr2
-------------------------------------------------------------------
array([[[    111,    2222, 2222222],
        [    333,    4444, 4444444]],

       [[    555,    6666, 6666666],
        [    777,    8888, 7777777]]])
===================================================================
arr3 = arr[0: 2, 0: 1]
arr3
-------------------------------------------------------------------
array([[[    111,    2222, 2222222]],

       [[    555,    6666, 6666666]]])
===================================================================
arr # 这里arr经arr3的切片操作后并未发生改变
-------------------------------------------------------------------
array([[[    111,    2222, 2222222],
        [    333,    4444, 4444444]],

       [[    555,    6666, 6666666],
        [    777,    8888, 7777777]],

       [[    999,    1010, 8888888],
        [    111,    1212, 9999999]]])
===================================================================
arr[0: 2, 0: 1, 1: 2] = 0 # 等效于arr3][1: 2]
arr
-------------------------------------------------------------------
array([[[    111,       0, 2222222],
        [    333,    4444, 4444444]],

       [[    555,       0, 6666666],
        [    777,    8888, 7777777]],

       [[    999,    1010, 8888888],
        [    111,    1212, 9999999]]])
===================================================================

二, 通⽤函数: 快速的元素级数组函数

三,利⽤数组进⾏面向数组编程

四,使用数组进行⽂件输⼊输出

五,线性代数

六,伪随机数生成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值