numpy
[TOC]
简介
标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。
NumPy的诞生弥补了这些不足,NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray(下文统一称之为数组)是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数
包导入
import numpy as np
ndarray对象
ndarray对象是一个同质的多维数组,其中存储相同数据类型,以整数进行索引的内容。
以下是该对象具有的属性:
- ndarray.ndim: 对象的维度数
- ndarray.shape: 每个维度的深度
- ndarray.size : 数组中总的元素数
- ndarray.dtype : 数组中元素的类型
- ndarray.itemsize: 数组元素的字节大小,比如说某一个元素是几个字节的。
常用的函数
创建
- 我们可以通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(下例中的变量c)
python中的序列对象包括了:列表, 元素
np.array([1.2, 3.5, 5.1])
np.array(1,2,3,4) # WRONG
np.array([(1.5,2,3), (4,5,6)]
np.array( [ [1,2], [3,4] ], dtype=complex )
其中第二项是经常犯的错误,直接使用多个数值调用array。数据类型是从序列对象中的元素推倒而来。
- 创建大小已知,元素值初始化的ndarray.
np.zeros( (3,4) ) # 维度为(3,4)的数组,初始化为0
np.ones( (2,3,4), dtype=np.int16 ) # dtype can also be specified
np.empty( (2,3) ) #未初始化的, 输出变化可能非常的大
np.arange( 10, 30, 5 ) #创建序列化的元素,参数:开始(默认0),结束,步长(默认1)
np.arange( 0, 2, 0.3 ) #array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
np.linspace( 0, 2, 9 ) #创建固定个数的元素 9 numbers from 0 to 2
创建之后的序列,我们可以使用reshape对数组的维度进行修改
x=np.linspace( 0, 2, 9 )
x.reshape(3,3) #改变数组的维度
下面是剩下的一些函数:
numpy.random.rand(d0, d1, ..., dn) #在指定的维度,随机的生成元素值,返回[0,1)的均匀分布
numpy.random.randn(d0, d1, ..., dn)#返回指定维度数量标准正态分布样本
sigma * np.random.randn(...) + mu #生成其他的正态分布
umpy.fromfunction(function, shape, **kwargs)[source]¶
numpy.fromfile #从文件中生成,需要与其他的函数一起使用
参考:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
打印
打印的规则如下:
>>> 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]]]
基本操作
- 应用到数组中的基本操作是elementwise的。结果返回的是一个新的数组。
>>> 10*np.sin(a)
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
- *操作符是elementwise的, numpy中的矩阵乘法是用dot
- +=, *= 运算符原地修改现有的多维数组
a=np.ones((3,3),dtype=int)
a*=3
>>> a
array([[3, 3, 3],
[3, 3, 3]])
- 许多基本操作都是直接应用到ndarray类上面的,例如:
>>> a = np.random.random((2,3))
>>> a
array([[ 0.18626021, 0.34556073, 0.39676747],
[ 0.53881673, 0.41919451, 0.6852195 ]])
>>> a.sum()
2.5718191614547998
>>> a.min()
0.1862602113776709
>>> a.max()
0.6852195003967595
默认的情况下,这些操作是价格ndarray当作list,而不管维度信息,不过你可以指定axis参数进行更细粒度的计算。
>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>>
>>> b.sum(axis=0) # sum of each column
array([12, 15, 18, 21])
>>>
>>> b.min(axis=1) # min of each row
array([0, 4, 8])
array的维度信息:
- 全局的函数
numpy提共了一些全局的函数 - 索引,切片
- 维度操作
- 堆叠不同的数组
不同的数组可以沿着不同的维度堆叠起来。
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[ 8., 8.],
[ 0., 0.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[ 1., 8.],
[ 0., 4.]])
>>> np.vstack((a,b))
array([[ 8., 8.],
[ 0., 0.],
[ 1., 8.],
[ 0., 4.]])
>>> np.hstack((a,b))
array([[ 8., 8., 1., 8.],
[ 0., 0., 0., 4.]])
参考:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
- 复制和视图
网友评论