加载包: from numpy import *
一、创建numpy数组:
有多种方式:使用 Python 列表或元祖,使用 arange, linspace 等函数,从文件中读取数据。
1. 列表生成numpy数组
v=array([1,2,3,4])
m=array( [ [1,2],[3,4] ] )
type(v):类型查看,结果为numpy 模块提供的 ndarray 类型
v.shape :通过 ndarray.shape 获得它的维度属性
v.size :通过ndarray.size获取数组的元素数量
shape(M),size(M):使用 numpy.shape 与 numpy.size 函数获取对应属性值
M.dtype:使用 ndarray 的 dtype 属性获得数组元素的类型
numpy.ndarray与list区别:
- Python 的 list 是动态类型,可以包含不同类型的元素,所以没有支持诸如点乘等数学函数,因为要为 list 实现这些操作会牺牲性能。
- Numpy 数组是静态类型并且齐次。 元素类型在数组创建的时候就已经确定了。
- Numpy 数组节约内存。
- 由于是静态类型,对其数学操作函数(如矩阵乘法,矩阵加法)的实现可以使用 C 或者 Fortran 完成。
M = array([[1, 2], [3, 4]], dtype=complex) :通过在创建数组时使用 dtype 关键字参数显示地定义元素类型。dtype 的常用值有:int, float, complex, bool, object 等,大小比如:int64/16, float128, complex128
2. 使用函数来生成数组
需要生产大数组时可以使用函数来生成数组,最常用的有如下几个函数:
arange
x = arange(0, 10, 1) #arguments: start, stop, step
=> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])linspace 与 logspace
linspace(0, 10, 25):# using linspace, both end points ARE included 生成25个0~10的数
logspace(0, 10, 10, base=e) 加对数生成10个数mgrid
x, y = mgrid[0:5, 0:5]:# similar to meshgrid in MATLAB 生成网格数据
x为每行元素相同,按行从0~4递增
y为每列元素相同,按列从0~4递增random data
from numpy import random:导入
random.rand(5,5): uniform random numbers in [0,1]
random.randn(5,5):standard normal distributed random numbersdiag
diag([1,2,3]): a diagonal matrix
=> array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
diag([1,2,3], k=1) : diagonal with offset from the main diagonal
=> array([[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 3],
[0, 0, 0, 0]])- zeros 与 ones
zeros((3,3))
ones((3,3))
3. 文件 I/O 创建数组
CSV
CSV是一种常用的数据格式化文件类型,从中读取数据使用numpy.genfromtxt 函数。
data = genfromtxt(‘stockholm_td_adj.dat’) 读数据head stockholm_td_adj.dat,data为numpy 数组。
savetxt(“random-matrix.csv”, M,fmt=’%.5f’):使用 numpy.savetxt 将 Numpy 数组保存到csv文件中。 # fmt specifies the format
!cat random-matrix.csv:查看文件。Numpy 原生文件类型
使用 numpy.save 与 numpy.load 保存和读取:
save(“random-matrix.npy”, M)
load(“random-matrix.npy”)numpy 数组的常用属性
M.itemsize //bytes per element
M.nbytes //number of bytes
M.ndim //number of dimensions4. 操作数组
- 索引
v[0],M[1,1]:用方括号进行检索
如果是N(N > 1)维数列,在检索时省略了一个索引值则会返回一整行((N-1)维数列),例:
M
=> array([[ 0.70506801, 0.54618952, 0.31039856],
[ 0.26640475, 0.10358152, 0.73231132],
[ 0.07987128, 0.34462854, 0.91114433]])
M[1]
=> array([ 0.26640475, 0.10358152, 0.73231132])
使用 : 能达到同样的效果:
M[1,:] # row 1
=> array([ 0.26640475, 0.10358152, 0.73231132])
M[:,1] # column 1
=> array([ 0.54618952, 0.10358152, 0.34462854])
可以利用索引进行赋值:M[1,:] = 0,M[:,2] = -1
- 切片索引
M[lower:upper:step]:A[1:3]取下标1到3,不包括3.
进行切片赋值时,原数组会被修改。参数可任意省略:
A[::] 输出所有元素
负值索引从数组尾开始计算:A[-3:] # the last three elements
索引切片在多维数组的应用也是一样的:
A = array([[n+m*10 for n in range(5)] for m in range(5)])
=>array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14],
[20, 21, 22, 23, 24],
[30, 31, 32, 33, 34],
[40, 41, 42, 43, 44]])
- 高级索引
指使用列表或者数组进行索引:
row_indices = [1, 2, 3]
A[row_indices]
=> array([[10, 11, 12,13, 14],
[20, 21, 22, 23, 24],
[30, 31, 32, 33, 34]])
col_indices = [1, 2, -1] # remember, index -1 means the last element
A[row_indices,col_indices]
=> array([11, 22, 34])
可以用索引掩码:
B = array([n for n in range(5)])
B
=> array([0, 1, 2, 3, 4])row_mask = array([True, False, True, False, False])
B[row_mask]
=> array([0, 2])row_mask = array([1,0,1,0,0], dtype=bool)
B[row_mask]
使用比较操作符生成掩码:
x = arange(0, 10, 0.5)
x
=> array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ,
5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5])mask = (5 < x) * (x < 7.5)
mask
=> array([False, False, False, False, False, False, False, False, False,
False, False, True, True, True, True, False, False, False,
False, False], dtype=bool)x[mask]
=> array([ 5.5, 6. , 6.5, 7. ])