来自:https://docs.scipy.org/doc/numpy/user/quickstart.html版权作者所有
right @https://docs.scipy.org/doc/numpy/user/quickstart.html
1 安装
win与linux都可用pip安装numpy,记得改源。
想知道代码什么效果,可以自己玩一下
2 ndarray基础
2.1 简单生成,主要看属性
import numpy as np ex = np.arange(18).reshape(3,6) ex.shape ex.ndim ex.dtype.name ex.itemsize#单元素字节数 ex.size#18个元素 type(ex)
2.2 其他生成
ex = np.array([1,2,3],dtype=np.int16) ex = np.ones((2,2),dtype = np.int16) ex = np.zero((2,5),dtype = complex)
ex = np.random.random((2,3)) ex = np.empty((10,10),dtype = np.int16) ex = np.array([[1,2],[3,4]]) ex = np.arange(0,0.5,4) from numpy import pi ex = np.linspace(0,pi,5)#0到pie中间取五个
def f(x,y): return x*10+y b = np.fromfunction(f,(3,2),dtype = np.int16)#建立数组会把二维索引放到二元函数f中跑一圈,结果当作该索引处的元素值
2.3 操作符
A*B#矩阵内元素直接相乘 A.dot(B)#矩阵乘法 np.dot(A,B)
B+=B#会直接更改B矩阵 A+=B#A int B float,则本句报错,python不会私自降你精度
a.max() a.min() a.sum()
a.sum(axis = 1)#指定维度求和 a.min(axis = 0) a.cumsum(axis = 1)#每个位置是之前的累加
2.4 通用函数
np.exp(B)#指数 np.sqrt(B)#开根 np.add(B,C)#相加
2.5 index and slice
与python相同,所以更简略的记一下:
b = a[:6:2]#从头到第六个,每隔两个取一个 for i in a print i
B[-1]#想得到所有元素,直接输入一个不存在的索引 B[1,...]#第一维取第一个元素,其他维都给我取出来(1,x,y,..) B[1,2,...,:] B[1,...,:,1] B[...,1,2] for r in B:#按行打印 print(r) for e in B.flat:#逐元素打印 print(e)
2.6 Shape Manipulation
不论多少维度的数组在内存中不过是有序的数值,所以随便改变维度,也能还原回去ravel都不需要复制,直接读内存就是这样的。numpy用的是c语言的存储形式。
a.ravel()#所有张量拍扁,全变成一维的,不会改变原有矩阵的维度 a.reshape(3,4)#改变组织形式
a.T#转置
a.resize(2,6)#直接改变a的组织形式,a维度变了 a.resize(2,-1)#比方说你数学很差,你不知道第一个维度2,后一个是6,你写-1,numpy会帮你计算
2.7 顺着数轴拼接矩阵
vstack(a,b)#上下码,增加行长度 hstack(a,b)#左右码,增加列长度
from numpy import newaxis np.column_stack((a,b))#只有二维左右码效果同hstack,但是一维组合不同于hstack。这个函数很奇葩,如果是行向量,它会上下码,列向量会左右码,反正无论如何你都得变成二维
np.rowstack((a,b))却和vstack不论维度的功能一致。
concatenate这个函数可以指定axis。
np.c_[1:4]#觉得列向量自动生成不知道冒号放在哪?那么这个神奇的函数可以给你直接生成列向量,原理是,将得到的元素上下堆砌。
np.r_[1:4,3,5,22]
2.8 大数组分解为若干小数组
np.hsplit(a,2)#将a每行左右分成两半 np.hsplit(a,(2))#将a在第二列后切一刀 np.hsplit(a,(2,3,4,5))#在2345后分别切一刀 np.vsplit(a,2)#与上面不同的是这个切的是列 np.vsplit(a,(2))
更自由的切割:np.array_split(a,3,axis=0)
2.9 复制
毕竟比c高级的语言,你不知道函数的具体实施有没有复制你的数组,还是直接改,这个还是需要留意的。必须留意。
- 完全不复制
相当于直接将b这个名字指代的地址填写成了a的地址。打个比方,一件商品有一个标签,那么YSL口红上面系了价格标签a,然后你手里面还有个标签b,比如说是打五折的标签(五折!做梦都别想),你把b系到这只口红上,你顺着a,b的绳子,都指的是这只ysl口红。
b=a def f(x): b=x
- 介于复制与不复制之间的view
view()相当于每个元素都指向之前的元素,所以新数组改变了,也会修改原始矩阵的值,却没有办法改变原始矩阵的形状,也就是整体的数据不是指针,只有内在的每个元素是指针。本质上依旧是新的数据,需要新的内存。只不过存的是指针罢了。
实现手法官方没写在这。仅仅是我要达到这种效果我就会这么写,实际上我也不知道他怎么写的,效果的确是这样没错。
c = a.view() c is a #False c base is a #True c.flags.owndata #False c.shape = 2,-1# a的形状不改变 c[0,0]=23#a的数值也会改变,不论c的形状变成什么样
h = a[1:5] h[3] = 445#同时a的值也会改变,等同于view
- 复制
co = a.copy()
相当于申请个内存,然后挨个元素复制,然后再让co地址指向新的内存
好了,基础的操作就结束了
以下内容引用 cite from https://docs.scipy.org/doc/numpy/user/quickstart.htmlArray Creation
arange
,
array
,
copy
,
empty
,
empty_like
,
eye
,
fromfile
,
fromfunction
,
identity
,
linspace
,
logspace
,
mgrid
,
ogrid
,
ones
,
ones_like
,
r,
zeros
,
zeros_like
Conversions
ndarray.astype
,
atleast_1d
,
atleast_2d
,
atleast_3d
,
mat
Manipulations
array_split
,
column_stack
,
concatenate
,
diagonal
,
dsplit
,
dstack
,
hsplit
,
hstack
,
ndarray.item
,
newaxis
,
ravel
,
repeat
,
reshape
,
resize
,
squeeze
,
swapaxes
,
take
,
transpose
,
vsplit
,
vstack
Questions
all
,
any
,
nonzero
,
where
Ordering
argmax
,
argmin
,
argsort
,
max
,
min
,
ptp
,
searchsorted
,
sort
Operations
choose
,
compress
,
cumprod
,
cumsum
,
inner
,
ndarray.fill
,
imag
,
prod
,
put
,
putmask
,
real
,
sum
Basic Statistics
cov
,
mean
,
std
,
var
Basic Linear Algebra
cross
, dot
, outer
, linalg.svd
, vdot