『Numpy』常用方法记录

numpy教程

广播机制

numpy计算函数返回默认是一维行向量:

import numpy as np

a = [[1,1,1],
    [2,2,2],
    [3,3,3]]
b = (np.sum(a,axis=1))
c = (np.sum(a,axis=0))
print(b,‘\n‘,c)

# [3 6 9]
# [6 6 6]

所以广播之实际是高维对一维行向量的广播:

除法广播:

b = a/(np.sum(a,axis=1))
c = a/(np.sum(a,axis=0))
print(b,‘\n‘,c)

# [[ 0.33333333  0.16666667  0.11111111]
#  [ 0.66666667  0.33333333  0.22222222]
#  [ 1.          0.5         0.33333333]]
# [[ 0.16666667  0.16666667  0.16666667]
#  [ 0.33333333  0.33333333  0.33333333]
#  [ 0.5         0.5         0.5       ]]

向量乘法,加法可以类比:

np.array([1,2,3])*np.array([1,1,1])
# [1 2 3]

np.array([1,2,3])*np.array([1])
# [1 2 3]

np.array([1,2,3])*np.array([1,1])
# 报错

np.array([[1],[1],[1]])*np.array([1,2,3])
# [[1 2 3]
#  [1 2 3]
#  [1 2 3]]

线性代数相关

『Numpy学习指南』第六章_深入学习NumPy模块(其一:线性代数模块)

np.diag():对角阵生成

np.linalg.det():求行列式

np.linalg.inv():矩阵求逆

np.linalg.eig():对称阵特征值分解

np.linalg.svd():任意阵SVD分解

通用函数

使单输入单输出的函数具备广播功能,frompyfunc(fun, in_num, out_num),常用f = frompyfunc(fun, 1, 1)

>>> oct_array = np.frompyfunc(oct, 1, 1)

>>> oct_array(np.array((10, 30, 100)))
array([012, 036, 0144], dtype=object)

>>> np.array((oct(10), oct(30), oct(100))) # for comparison
array([‘012‘, ‘036‘, ‘0144‘],
      dtype=‘|S4‘)

np.sum(array1 == array2,dtype=float)

bool转换为数组默认是整形,需要手动修改为浮点型,比较值得注意的tip,或者说由于python本身不做区分,所以在numpy中必须特别注意数字类型的问题

取整

np.rint(result) # 四舍五入
np.ceil(result) # 向上取整
np.floor(result) # 向下取整

np.unique()

保留数组中不同的值

>>> a=np.random.randint(0,5,8)
>>> a
array([2, 3, 3, 0, 1, 4, 2, 4]) 

>>> np.unique(a)
array([0, 1, 2, 3, 4]) 

>>> c,s=np.unique(b,return_index=True)
>>> c
array([0, 1, 2, 3, 4])
>>> s
array([3, 4, 0, 1, 5])(元素出现的起始位置)

np.full((shape), value, type)

numpy数组初始化函数

np.split(array, num)

把数组顺序等分

np.fun.at(array, index_array, [array2])

fun需要一个参数时等价np.fun(array[index_array]),多参数用法如下:

Examples

Increment items 0 and 1, and increment item 2 twice:

>>> a = np.array([1, 2, 3, 4])
>>> np.add.at(a, [0, 1, 2, 2], 1)
>>> print(a)
array([2, 3, 5, 4])

Add items 0 and 1 in first array to second array, and store results in first array:

>>> a = np.array([1, 2, 3, 4])
>>> b = np.array([1, 2])
>>> np.add.at(a, [0, 1], b)
>>> print(a)
array([2, 4, 3, 4])

特色,

#np.add.at(dW, x, dout)
#dW[x] += dout # this will not work, see the doc of np.add.at
a = np.array([1,2,3,4,5,6,7])
i = np.array([0,1,2,0,1])
b = np.array([1,2,3,4,5])
np.add.at(a, i, b)
print(a)
a = np.array([1,2,3,4,5,6,7])
i = np.array([0,1,2,0,1])
b = np.array([1,2,3,4,5])
a[i] += b
print(a)

输出如下,即索引重复的时候,只有np.add.at会累积前面的结果,单纯的索引会取最后一次的结果覆盖,

[6 9 6 4 5 6 7]

[5 7 6 4 5 6 7]

np.save() & np.load()

np.save(‘./bottleneck/{1}/{0}‘.format(img.split(‘/‘)[-1].split(‘.‘)[0], file_name),bottleneck_values)
bottleneck_string = np.load(os.path.join(base_path,                                         ‘bottleneck‘,                                         train_or_test,                                         label_name,                                         bottlenecks_tensor_name))

np.loadtxt()

np.loadtxt(‘housing.data‘)     # 读取数据
  本函数读取数据后自动转化为ndarray数组,可以自行设定分隔符delimiter=","

np.insert()

np.insert(scale_data, 0, 1, axis=1)      # 数组插入函数

  在数组中插入指定的行列,numpy.insert(arr, obj, values, axis=None),和其他数组一样,axis不设定的话会把数组定为一维后插入,axis=0的话行扩展,axis=1的话列扩展

np.matrix()

『科学计算_理论』优化算法:梯度下降法&牛顿法

学习了numpy中的矩阵类型:np.matrix(),在牛顿法中我用的是matrix,在梯度下降法中我用的是array:

matrix是array的子类,特点是有且必须只是2维,matrix.I()可以求逆,和线代的求逆方法一致,所以绘图时我不得不才用np.sequeeze(np.asarray())操作来降维,而由于x[:, -1]这种操作对array会自动降维(由两行变为一行),所以要么使用matrix,要么切片后reshape(2,1),总之不消停。

np.concatenate()

『科学计算_理论』优化算法:梯度下降法&牛顿法

注意到数组拼接方法都是不破坏原数组,单纯返回新数组的,且axis=0是行拼接(行数增加),axis=1是列拼接(列数增加),

x_n = np.concatenate((x_n, x_n[:,-1] - np.linalg.inv(H).dot(dx_n)),axis=1)

np.newaxis

用于扩展维度,numpy中没有expend_dim这样的函数,而使用np.newaxis标记来实现扩维:

a = np.array([1,2,3,4,5])
a = a[:,np.newaxis]
a
Out[44]:
array([[1],
       [2],
       [3],
       [4],
       [5]])
a = np.array([1,2,3,4,5])
a = a[np.newaxis,:]
a
Out[47]:
array([[1, 2, 3, 4, 5]])

array.transpose(1,0,2)

转置,1维没效果(并不能行列互化),高维后面参数维转置顺序,假如(T,N,H)经过上面的命令会变为(N,T,H)

np.bincount()

计数&投票函数

numpy.bincount详解

np.maximum(X, Y, out=None):

    • X 与 Y 逐位比较取其大者;
    • 最少接收两个参数

np.squeeze():剔除长度为一的轴

np.squeeze(np.array([[1,2,3]]))
# Out[17]:
# array([1, 2, 3])
np.squeeze(np.array([[1],[2],[3]]))
# Out[18]:
# array([1, 2, 3])

numpy.roll():平移数组行列

>>> x = np.arange(10) >>> np.roll(x, 2) array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])>>> x2 = np.reshape(x, (2,5))
>>> x2
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
>>> np.roll(x2, 1)
array([[9, 0, 1, 2, 3],
       [4, 5, 6, 7, 8]])
>>> np.roll(x2, 1, axis=0)
array([[5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4]])
>>> np.roll(x2, 1, axis=1)
array([[4, 0, 1, 2, 3],
       [9, 5, 6, 7, 8]])

计算机视觉中人为建立图像抖动会使用这个函数:

『cs231n』作业3问题4选讲_图像梯度应用强化

ox, oy = np.random.randint(-max_jitter, max_jitter+1, 2)                    # 随机抖动生成
X = np.roll(np.roll(X, ox, -1), oy, -2)                                     # 抖动,注意抖动不是随机噪声

pass

X = np.roll(np.roll(X, -ox, -1), -oy, -2)                                  # 还原抖动
时间: 2024-10-03 09:51:22

『Numpy』常用方法记录的相关文章

『Numpy』内存分析_numpy结构化数组

三.numpy的结构数组 『Numpy』内存分析_numpy.dtype内存数据解析方式指导 利用np.dtype可以构建结构数组,numpy.ndarray.base会返回内存主人的信息,文档如下, Help on getset descriptor numpy.ndarray.base: base    Base object if memory is from some other object.        Examples    --------    The base of an

『Numpy』内存分析_利用共享内存创建数组

引.内存探究常用函数 id(),查询对象标识,通常返回的是对象的地址 sys.getsizeof(),返回的是 这个对象所占用的空间大小,对于数组来说,除了数组中每个值占用空间外,数组对象还会存储数组长度.数组类型等其他信息 numpy.ndarray.ctypes.data属性,返回numpy数组的内存位置 array.array.buffer_info(),数组对象的内存信息,返回元素起始地址和元素个数 help(array.buffer_info)'''buffer_info(self,

『Numpy』内存分析_numpy.dtype内存数据解析方式指导

numpy.dtype用于自定义数据类型,实际是指导python程序存取内存数据时的解析方式. [注意],更改格式不能使用 array.dtype=int32 这样的硬性更改,会不改变内存直接该边解析过程,导致读取出问题,所以使用 array.astype(int32) ,这样才安全. 一.基本使用示例 // 定义一个数据类型,其中name为16为字符串,grades为2个float64的子数组 >>> dt = np.dtype([('name', np.str_, 16), ('gr

『Networkx』常用方法

这是一个用于分析'图'结构的包,由于我只是用到了浅显的可视化功能,所以这个介绍会对其使用浅尝辄止. 解决matplotlib中文字体缺失问题, from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 读入数据, import pandas as pd import n

『Re』正则表达式模块_常用方法记录

『Re』知识工程作业_主体识别 一个比较完备的正则表达式介绍 几个基础函数 re.compile(pattern, flags=0) 将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的match ()和search ()等方法. 实际有两种使用方式: pattern.匹配方法(string) 或者 re.匹配方法(pattern,string) 使用或|来强化匹配规则: pattern_t = re.compile( '[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1,3

『Python』Numpy学习指南第九章_使用Matplotlib绘图

坐标轴调节以及刻度调节参见:『Python』PIL&plt图像处理_矩阵转化&保存图清晰度调整 数据生成: 1 import numpy as np 2 import matplotlib.pyplot as plt 3 4 func = np.poly1d(np.array([1,2,3,4])) 5 func1 = func.deriv(m=1) # 求一阶导数 6 func2 = func.deriv(m=2) # 求二阶导数 7 8 x = np.linspace(-10,10,3

『TensorFlow』迁移学习_他山之石,可以攻玉

目的: 使用google已经训练好的模型,将最后的全连接层修改为我们自己的全连接层,将原有的1000分类分类器修改为我们自己的5分类分类器,利用原有模型的特征提取能力实现我们自己数据对应模型的快速训练.实际中对于一个陌生的数据集,原有模型经过不高的迭代次数即可获得很好的准确率. 实战: 实机文件夹如下,两个压缩文件可以忽略: 花朵图片数据下载: 1 curl -O http://download.tensorflow.org/example_images/flower_photos.tgz 已经

『TensorFlow』常用函数实践笔记

查询列表: 『TensorFlow』函数查询列表_数值计算 『TensorFlow』函数查询列表_张量属性调整 『TensorFlow』函数查询列表_神经网络相关 经验之谈: 节点张量铺设好了之后,只要不加sess.run(),可以运行脚本检查张量节点是否匹配,无需传入实际数据流. 'conv1'指节点,'conv1:0'指节点输出的第一个张量. sess上下文环境中的函数调用即使不传入sess句柄,函数体内也存在于默认的sess环境中,可以直接sess.run(). image_holder

『TensorFlow』以GAN为例的神经网络类范式

1.导入包: import os import time import math from glob import glob from PIL import Image import tensorflow as tf import numpy as np import ops # 层函数封装包 import utils # 其他辅助函数 2.简单的临时辅助函数: def conv_out_size_same(size, stride): # 对浮点数向上取整(大于f的最小整数) return i