官方文档 numpy 数组 张量 声明 操作 极简笔记 必须知道的基础操作

来自: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中跑一圈,结果当作该索引处的元素值
 
 

linspace详细

arange详细

zeros_like详细

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.html

Array Creation


arangearraycopyemptyempty_likeeyefromfilefromfunction, identitylinspacelogspacemgridogridonesones_likerzeros, zeros_like


Conversions


ndarray.astypeatleast_1datleast_2datleast_3dmat


Manipulations


array_splitcolumn_stackconcatenatediagonaldsplitdstackhsplit, hstackndarray.itemnewaxisravelrepeatreshaperesizesqueeze, swapaxestaketransposevsplitvstack


Questions


allanynonzerowhere


Ordering


argmaxargminargsortmaxminptpsearchsortedsort


Operations


choosecompresscumprodcumsuminnerndarray.fillimagprodput, putmaskrealsum


Basic Statistics


covmeanstdvar


Basic Linear Algebra


crossdotouterlinalg.svdvdot

猜你喜欢

转载自blog.csdn.net/u013249853/article/details/80395146