前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python的numpy入门简介

python的numpy入门简介

作者头像
用户7886150
修改2021-01-07 10:25:56
修改2021-01-07 10:25:56
1.6K0
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Python中的numpy.sinh

2019独角兽企业重金招聘Python工程师标准>>>   

 import numpy as np

data=[1,2,3]

arr=np.array(data)    #将列表转为numpy.ndarray  np.array([2,4])

print arr           #[1 2 3]

print data          #[1,2,3]

print type(arr)     #<type 'numpy.ndarray'>

print arr.dtype     #int32

z = np.zeros((8,8),dtype=int)

arr=np.random.randn(8,4)

arr.ndim  #维度 arr.dtype.name #类型名 a.size 元素总数

arr.astype(np.float) #astype做了复制,并转换数据类型,数组本身不变,使用astype将float转换为int时小数部分被舍弃

str_arr = np.array(['1.25', '-9.6', '42'], dtype = np.string_)

float_arr = str_arr.astype(dtype = np.float)

a = np.array([4, 3, 1, 2])

j = np.argsort(a)  #[2 3 1 0]   a[j] #[1 2 3 4]  返回的是排序后的元素在之前的顺序的下标列表

#归一化,将矩阵规格化到0~1,即最小的变成0,最大的变成1,最小与最大之间的等比缩放

z = 10*np.random.random((5,5))

print z

zmin,zmax = z.min(),z.max()

z = (z-zmin)/(zmax-zmin)

print z

#生成0~10之间均匀分布的11个数,包括0和10

z = np.linspace(0,10,11,endpoint=True,retstep=True) #(array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.]), 1.0)

vector = numpy.array([5, 10, 15, 20])

vector == 10  #array([False,  True, False, False], dtype=bool)

matrix = numpy.array([[5, 10, 15],[20, 25, 30],[35, 40, 45],[2,3,4]])

second_column_25 = (matrix[:,1] == 25)

print second_column_25   #[False  True False False]

print(matrix[second_column_25, :])   #[[20 25 30]]

world_alcohol = numpy.genfromtxt("world_alcohol.txt", delimiter=",")

多维转换方式一样,但是多了arr.shpe输出维数元组(2L,3L),

arr.reshape()注意几个[]嵌套   

np.zeros(n)  np.ones((3,4,5)) np.empty((4,6))

#判断二维矩阵中有没有一整列数为0?

z = np.random.randint(0,3,(2,4))  从0、1、2构成两行4列二位数组[[1 0 2 0],[0 0 2 1]]

z.any(axis=0)  #[True False  True  True]

np.random.randint(2, size=10) #array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0])

np.random.randint(5, size=(2, 4)) #array([[4, 0, 2, 1],[3, 2, 2, 0]])

operation: arr*arr、arr - arr、1/arr、arr ** 0.5  #每个元素对应计算

索引:arr1[1][2]、arr2[1,2] 、arr[:2]、arr[:2, 1:]、arr[:2, 1:] = 0,

逗号两边是维度的变化,冒号两边是同一维度的起终位置

a[[0,1]] = a[[1,0]] 交换其中的两行

arr[0].copy(),复制的不随原数据的变化而变化

布尔索引:arr=[[1,2,3],[2,3,6]]

arr == 2  返回[[False True False] [True False False]] 

arr[arr == 2]  即返回[2 2]  还可以逻辑运算如 arr[-(arr == 2) |(arr == 2)]

数组索引(花式索引):

arr=np.arange(32).reshape((8,4))

arr[[4, 3, 0, 6]] # 打印arr[4]、arr[3]、arr[0]和arr[6]

arr[[-3, -5, -7]] # 打印arr[-3]、arr[-5]和arr[-7]行

arr[[1,-5,7,2],[0,3,1,2]] #arr[1, 0]、arr[5, 3],arr[7, 1]和arr[2, 2]

arr[[1,-5,7,2]][:,[0,3,1,2]] # 1572行的0312列

arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]  # 可读性更好的写法,同上

转置与点积:

arr.T 转置  np.dot(arr.T, arr)#点积

高维矩阵转换:

arr = np.arange(16).reshape((2, 2, 4))

arr数组的内容为

- a[0][0] = [0, 1, 2, 3]

- a[0][1] = [4, 5, 6, 7]

- a[1][0] = [8, 9, 10, 11]

- a[1][1] = [12, 13, 14, 15]

transpose的参数为坐标,正常顺序为(0, 1, 2, ... , n - 1),

现在传入的为(1, 0, 2)代表a[x][y][z] = a[y][x][z],第0个和第1个坐标互换。

- a'[0][0] = a[0][0] = [0, 1, 2, 3]

- a'[0][1] = a[1][0] = [8, 9, 10, 11]

- a'[1][0] = a[0][1] = [4, 5, 6, 7]

- a'[1][1] = a[1][1] = [12, 13, 14, 15]

print arr.transpose((1, 0, 2)) #返回变换后的数组,arr不变

print arr.swapaxes(1, 2)  # 直接交换第1和第2个坐标,arr不变

from numpy import pi   

np.linspace( 0, 2*pi, 5 )从0 到2pi分成5个数,起始确定了中间3个数,列表

NumPy的ndarray 快速的元素级数组函数

• 一元函数

类型 说明

abs, fabs 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs。

sqrt 计算各元素的平方根。相当于arr ** 0.5

sqare 计算各元素的平方。相当于arr ** 2

exp 计算各元素的e^x

log, log10, log2, log1p 分别为自然对数、底数为10的log、底数为2的log和log(1 + x)。

sign 计算各元素的正负号:1(正数)、0(零)、-1(负数)。

ceil 计算各元素的ceiling值,即大于等于该值的最小整数。

floor 计算各元素的floor值,即小于等于该值的最小整数。

rint 将各元素值四舍五入到最接近的整数,保留dtype。

modf 将数组的小数部分与整数部分以两个独立数组的形式返还。

isnan 返回一个表示“哪些值是NaN(这不是一个数字)”的布尔型数组

isfinite, isinf 分别返回一个表示“哪些元素是有限的(非inf,非NaN)”或“哪些元素是

无穷的”的布尔型数组

cos, cosh, sin, sinh, tan, tanh 普通型或双曲型三角函数

arccos, arccosh, arcsin, arcsinh,

arctan, arctanh

反三角函数

logical_not 计算各元素not x的真值。相当于-arr。

NumPy的ndarray 快速的元素级数组函数

• 二元函数 I

类型 说明

add 将数组中对应的元素相加

subtract 从第一个数组中减去第二个数组中的元素

multiply 数组元素相乘

divide, floor_divide 除法或向下取整除法

power 对第一个数组中的元素A和第二个数组中对应位置的元素B,计算A^B。

maximum, fmax 元素级的最大值计算。fmax将忽略NaN。

minimum, fmin 元素级的最小值计算。fmin将忽略NaN。

mod 元素级的求模计算

• 例子代码: universal_functions.py

类型 说明

copysign 将第二个数组中的符号复制给第一个数组中的值

greater, greater_equal, less,

less_equal,equal, not_equal

执行元素级的比较,最终产生布尔型数组。

logical_and, logical_or,

logical_xor

执行元素级的真值逻辑运算,最终产生布尔型数组。

用数组表达式代替循环的做法,通常被称为矢量化。arange、meshgrid

矢量化数组运算要比等价的纯Python方式快上一两个数量级

np.where(cond, x_arr, y_arr)当condition为True时,返回 x , 否则返回 y

np.abs(z-a).argmin()   z为数组,a为数,找出数组中与给定值最接近的数

利用数组进行数据处理 数学和统计方法

• 数学和统计方法

类型 说明

sum() 对数组中全部或某轴向的元素求和。零长度的数组的sum为0。

mean() 算术平均数。零长度的数组的mean为NaN。

std(), var() 分别为标准差和方差,自由度可调(默认为n)。

min(), max() 最大值和最小值

argmin() 分别为最大值和最小值的索引

cumsum() 所有元素的累计和

cumprod() 所有元素的累计积

利用数组进行数据处理 数学和统计方法

• cumsum和cumprod的解释

cumsum:

- 按列操作:a[i][j] += a[i - 1][j]

- 按行操作:a[i][j] *= a[i][j - 1]

cumprod:

- 按列操作:a[i][j] += a[i - 1][j]

- 按行操作:a[i][j] *= a[i][j - 1]

• 带axis参数的统计函数

arr.mean(axis = 1)  # 对每一行的 元素求平均

arr.sum(0)  # 对每一列元素求和,axis可以省略。

利用数组进行数据处理 用于布尔型数组的方法

• sum对True值计数 (arr > 0).sum()

• any和all测试布尔型数组,对于非布尔型数组,所有非0元素将会被当做True。

arr= np.array([False, False, True, False])

print arr.any() # 有一个为True则返回True

print arr.all() # 有一个为False则返回False

利用数组进行数据处理 排序

• 直接排序  在原数组上排序

• 指定轴排序

一维数组排序:arr.sort()

二维数组排序:arr.sort(1) # 对每一行元素做排序

找位置在5%的数字:arr.sort()   arr[int(0.05 * len(arr))]

利用数组进行数据处理 去重以及其它集合运算

• 去重以及其它集合运算

用unique函数去重

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])

print sorted(set(names))  # 传统Python做法['Bob', 'Joe', 'Will']

print np.unique(names)     #['Bob' 'Joe' 'Will']

ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])

print np.unique(ints)   #[1 2 3 4]

print '查找数组元素是否在另一数组'

values = np.array([6, 0, 0, 3, 2, 5, 6])

print np.in1d(values, [2, 3, 6])    #[ True False False  True  True False  True]

unique(x) 计算x中的唯一元素,并返回有序结果。

intersect1d(x, y) 计算x和y中的公共元素,并返回有序结果。

union1d(x, y) 计算x和y的并集,并返回有序结果。

in1d(x, y) 得到一个表述"x的元素是否包含于y"的布尔型数组

setdiff1d(x, y) 集合的差,即元素在x中且不在y中

setxor1d(x, y) 集合的异或,即存在于一个数组中但不同时存在于两个数组中的元素。

数组文件的输入输出

• 将数组以二进制格式保存到磁盘

• 存取文本文件

读取csv文件做为数组  arr = np.loadtxt('array.txt', delimiter = ',') #arr 为数组

数组文件读写:np.save('some_array', arr)

print np.load('some_array.npy')

多个数组压缩存储:np.savez('array_archive.npz', a = arr, b = arr)

arch = np.load('array_archive.npz')

print arch['b']

线性代数

• 常用的numpy.linalg函数 

diag 以一维数组的形式返回方阵的对角线(或非对角线元素),获将一维数组转换

为方阵(非对角线元素为0)。

dot 矩阵乘法   #mat.dot(inv(mat)) # 与逆矩阵相乘,得到单位矩阵。

trace 计算对角线元素的和

det 计算矩阵行列式

eig 计算方阵的特征值和特征向量

inv 计算方阵的逆  #inv(mat)  # 矩阵求逆

pinv 计算矩阵的Moore-Penrose伪逆

qr 计算QR分解

svd 计算奇异值分解

solve 解线性方程Ax = b,其中A为一个方阵。

lstsq 计算Ax = b的最小二乘解

随机数生成

• 部分numpy.random函数

seed 确定随机数生成器的种子

permutation 返回一个序列的随机排列或返回一个随机排列的返回

shuffle 对一个序列就地随机乱序

rand 产生均匀分布的样本值

randint 从给定的上下限范围内随机选取整数

randn 产生正态分布(平均值为0,标准差为1)

binomial 产生二项分布的样本值

normal 产生正态(高斯)分布的样本值

beta 产生Beta分布的样本值

chisquare 产生卡方分布的样本值

gamma 产Gamma分布的样本值

uniform 产生在[0, 1]中均匀分布的样本值

正态分布随机数:np.random.normal(size=(4, 4))

批量按正态分布生成0到1的随机数:N = 10

print[normalvariate(0, 1) for _ in xrange(N)]

print np.random.normal(size = N)  # 与上面代码等价

高级应用 数组重塑

• reshape重塑数组

• -1自动推导维度大小

arr.reshape((4, 2)).reshape((2, 4)) # 支持链式操作

维度大小自动推导 arr.reshape((5, -1))

高维数组拉平变一维  arr.ravel()

高级应用 数组的合并和拆分

• 数组连接函数

类型 说明

concatenate 最一般化的连接,沿一条轴连接一组数组

vstack, row_stack 以面向行的方式对数组进行堆叠(沿轴0)

hstack, 以面向行的方式对数组进行堆叠(沿轴1)

column_stack 类似于hstack,但是会先将一维数组转换为二维列向量。

dstack 以面向“深度”的方式对数组进行堆叠(沿轴2)

split 沿指定轴在指定的位置拆分数组

hsplit, vsplit, dsplit split的便捷化函数,分别沿着轴0、轴1和轴2进行拆分

高级应用 数组的合并和拆分

np.concatenate([arr1, arr2], axis = 0)  # 按行连接 

np.concatenate([arr1, arr2], axis = 1)  # 按列连接

np.vstack((arr1, arr2)) # 垂直堆叠  同上按行

np.hstack((arr1, arr2)) # 水平堆叠  同上按列

r_用于按行堆叠  np.r_[arr1, arr2]   同上按行

c_用于按列堆叠  np.c_[arr1, arr2]   同上按列

first, second, third = np.split(arr, [1, 3], axis = 0)#水平拆分 0行一个,1、2行一个,3..行一个

first, second, third = np.split(arr, [1, 3], axis = 1)#垂直拆分

高级应用 元素的重复操作

• _tile

• _repeat

arr = np.arange(3)

arr.repeat(3)   #[0,0,0,1,1,1,2,2,2]

arr.repeat([2, 3, 4]) # 3个元素,分别复制2, 3, 4次。长度要匹配!

Repeat指定轴'

arr.repeat(2, axis = 0) # 按行repeat 每行下面再复制行

arr.repeat(2, axis = 1) # 按列repeat 每列右边再复制列

np.tile(arr, 2)     #将arr重复2次

np.tile(arr, (2, 3))  # 指定每个轴的tile次数,即行重复两次,列重复三次

高级应用 花式索引的等价函数

• take

• put

arr = np.arange(10) * 100

inds = [7, 1, 2, 6]

arr.take(inds)  =  arr[inds]  #[700 100 200 600]

使用put更新内容:

arr.put(inds, 50) #更换制定位置的数,即将上面的数都换成50

arr.put(inds, [70, 10, 20, 60])

take,指定轴:

arr = np_random.randn(2, 4)

inds = [2, 0, 2, 1]

print arr.take(inds, axis = 1)  # 按列take 拿到第2,0,2,1列的数据矩阵

例题分析 距离矩阵计算

给定m × n阶矩阵X,满足X = [x1

, x2

, ... xn],这里第i列向量是m维向量。

求n × n矩阵,使得Dij = ||xi - xj||2

例题分析 距离矩阵计算

• 方法1:标准方法计算Dij

• D[i, j] = numpy.linalg.norm(X[:, i], X[:, j) ** 2

• 方法2:利用dot计算Dij

• d = X[:, i] - X[:, j]

• D[i, j] = numpy.dot(d, d)

例题分析 距离矩阵计算

• 方法3:减少dot调用次数

• Dij = (xi - xj)T(xi - xj) = xiTxi - 2xiTxj + xjTxj

• G = numpy.dot(X.T, X)

• Dij = Gii - 2Gij + Gjj

例题分析 距离矩阵计算

• 方法4:利用重复操作替代外部循环

• 在方法3的基础上,将D表达为H + K - 2G

• Hij = Gii, Kij = Gjj

• H = numpy.title(np.diag(G), (n, 1))

• K = HT

• D = H + HT - 2G

import numpy as np

import numpy.linalg as la

import time

X = np.array([range(0, 500), range(500, 1000)])

m, n = X.shape

t = time.time()

D = np.zeros([n, n])

for i in xrange(n):

    for j in xrange(i + 1, n):

        D[i, j] = la.norm(X[:, i] - X[:, j]) ** 2

        D[j, i] = D[i, j]

print time.time() - t

t = time.time()

D = np.zeros([n, n])

for i in xrange(n):

    for j in xrange(i + 1, n):

        d = X[:, i] - X[:, j]

        D[i, j] = np.dot(d, d)

        D[j, i] = D[i, j]

print time.time() - t

t = time.time()

G = np.dot(X.T, X)

D = np.zeros([n, n])

for i in xrange(n):

    for j in xrange(i + 1, n):

        D[i, j] = G[i, i] - G[i, j] * 2 + G[j,j]

        D[j, i] = D[i, j]

print time.time() - t

t = time.time()

G = np.dot(X.T, X)

H = np.tile(np.diag(G), (n, 1))

D = H + H.T - G * 2

print time.time() - t

转载于:https://my.oschina.net/u/3726752/blog/1575342

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档