将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]]])
===================================================================
二, 通⽤函数: 快速的元素级数组函数
三,利⽤数组进⾏面向数组编程
四,使用数组进行⽂件输⼊输出
五,线性代数
六,伪随机数生成
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/98166.html