Numpy

Numpy ndarray

N维数组对象ndarray, 是一系列同类型数据的集合, 索引以0下标开始, 创建一个ndarray对象, 需调用array函数:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
名称 描述
object 数组或嵌套的数列
dtype 数组元素的数据类型, 可选, 默认为None
copy 是否需要复制, 可选, 默认为True
order 创建数组的样式, C为行方向, F为列方向, A为任意方向(默认), 默认为None
subok 默认返回一个与基类类型一致的数组, 默认为False
ndmin 指定生成数组的最小维度, 默认为0

实例

import numpy as np
a = np.array([1, 2, 3])
print(a) # [1 2 3] # 多一个维度
a1 = np.array([[1, 2],[3, 4]])
print(a1)
# [[1 2]
# [3 4]] # 最小维度
a2 = np.array([1,2, 3, 4, 5], ndmin=2)
print(a2) # [[1 2 3 4 5]] # dtype参数
a3 = np.array([1, 2, 3], dtype=complex)
print(a3) # [1.+0.j 2.+0.j 3.+0.j]

数据类型

  • numpy支持的数据类型比python内置的数据类型多很多, 基本上可以和C语言的数据类型对应上.
  • numpy的数值类型实际上是dtype对象的实例, 并对应唯一的字符, np.int32, np.float32等.

数据类型对象(dtype)

  • 数据类型对象是用来描述与数组对象的内存区如何使用, 依赖于数组的类型, 数据的大小, 数据的字节顺序, 结构化类型下字段的名称等等.
  • 字节顺序是通过对数据预先设定'<'或'>'来决定的, '<'意味着小端法, 即最小值存储在最小的地址, 即低位在最前面; '>'意味着大端法, 即高位放在前面.
num.dtype(object, align, copy)

# object 要转换为的数据类型对象
# align 若为true时, 填充字段使其为类似C的结构体
# copy 复制dtype对象, 若为false, 则是对内置函数类型对象的引用
  • 每个内建类型都对应一个唯一定义的字符代码
字符 对应类型
b 布尔型
i 有符号整型
u 无符号整型
f 浮点型
c 复数浮点型
m timedelta 时间间隔
M datetime 日期时间
O python对象
S,a byte字符串
U Unicode
V 原始数据 void

实例


# 使用标量类型
dt = np.dtype(np.int32)
print(dt)
# int32 # int8, int16, int32, int64四种数据类型可以使用字符串'i1', 'i2', 'i3', 'i4'代替
dt1 = np.dtype('i4')
print(dt1)
# int32 # 字节顺序标注
dt2 = np.dtype('<i4')
print(dt2)
# int32 # 结构化数据类型的使用, 类型字段和对应的实际类型被创建
dt3 = np.dtype([('age', np.int8)])
print(dt3)
# [('age', 'i1')] # 将数据类型应用于ndarray对象
dt4 = np.dtype([('age', np.int8)])
a4 = np.array([(10,), (20,),(30,)], dtype=dt4)
print(a4)
# [(10,) (20,) (30,)] print(a4.dtype)
# [('age', 'i1')] # 类型字段名可以用于存取实际的age列
dt5 = np.dtype([('age', np.int8)])
a5 = np.array([(10,), (20,),(30,)], dtype=dt4)
print(a5['age'])
# [10 20 30] # 定义一个结构化数据类型student, 包含字符串字段name, 整数字段age, 及浮点子弹marks, 并将这个dtype应用到ndarray对象
student = np.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')])
a6 = np.array([('abc', 21, 50), ('xyz', 18, 75)], dtype=student)
print(student)
print(a6) # [('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
# [(b'abc', 21, 50.) (b'xyz', 18, 75.)]

数组属性

  • 数组的维数为秩, 一维数组的秩为1, 二维数组的秩为2.
  • 每一个线性的数组称为是一个轴(axis), 也就是维度(dimensions), 而轴的数量---秩, 就是数组的维数.
  • axis=0, 表示沿着第0轴进行操作, 即对每个列进行操作;axis=1, 表示沿着第1轴进行操作, 即对每个行进行操作.
属性 说明
ndarray.ndim 秩, 轴的数量或者维度的数量
ndarray.shape 数组的维度, 返回一个元组, 对于矩阵, n行m列,
ndarray.size 数组元素的总个数, n*m
ndarray.dtype 元素类型
ndarray.itemsize 每个元素的大小, 以字节为单位
ndarray.flags 内存信息
ndarray.real 实部
ndarray.imag 虚部
ndarray.data 数组元素的缓冲区(一般通过数组的索引获取元素, 通常这个属性不常用)

创建数组

numpy.empty

  • 用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组
numpy.empty(shape, dtype = float, order = 'C')

# shape 数组形状
# dtype 数据类型, 可选
# order 有'C'和'F'两个选项, 分别表示行优先, 和列优先, 在内存中存储元素的顺序
x1 = np.empty([3, 2], dtype=int)
# 数组元素为随机值, 因为未初始化
print(x1)
'''
[[ 848 0]
[ 848 0]
[-997652816 182]]
'''

numpy.zeros

  • 创建指定大小的数组, 数组元素以0来填充
numpy.zeros(shape, dtype = float, order = 'C')
# 默认为浮点数
x2 = np.zeros(5)
print(x2)
# [0. 0. 0. 0. 0.] # 设置为整数
x3 = np.zeros((5,), dtype=np.int)
print(x3)
# [0 0 0 0 0] # 自定义类型
x3 = np.zeros((2,2), dtype=[('x','i4'), ('y','i4')])
print(x3)
'''
[[(0, 0) (0, 0)]
[(0, 0) (0, 0)]]
'''

numpy.ones

numpy.ones(shape, dtype = None, order = 'C')
# 默认为浮点数
x4 = np.ones(5)
print(x4)
# [1. 1. 1. 1. 1.] # 设置为整型
x4 = np.ones([2, 2], dtype=np.int)
print(x4)
'''
[[1 1]
[1 1]]
'''

从已有的数组创建数组

numpy.asarray

numpy.asarray(a, dtype = None, order = None)

# a 任意形式的输入参数, 列表, 列表的元组, 元组, 元组的元组, 元组的列表, 多维数组
# dtype 数据类型, 可选
# order 可选, 有C和F两个选项, 行优先和列优先

# 将列表转换为ndarray
lst1 = [1, 2, 3]
x6 = np.asarray(lst1)
print(x6)
# [1 2 3] # 将元组转换为ndarray
t1 = (1, 2, 3)
x7 = np.asarray(t1)
print(x7) # 将元组转换为ndarray
t1 = (1, 2, 3)
x7 = np.asarray(t1)
print(x7)
# [1 2 3] # 将元组的列表转换为ndarray
lst2 = [(1, 2, 3), (4, 5)]
x8 = np.asarray(lst2)
print(x8)
# [(1, 2, 3) (4, 5)] # 设置dtype参数
x9 = np.asarray(lst1, dtype=float)
print(x9)
# [1. 2. 3.]

numpy.frombuffer

  • 用于实现动态数组, 接受buffer输入参数, 以流的形式读入转化成ndarray对象.
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

# 注意: buffer是字符串时, 要转成bytes, 即在原字符串前加上b.
参数 描述
buffer 任意对象, 会以流的形式读入
dtype 返回数组的数据类型, 可选
count 读取的数据数量, 默认为-1, 读取所有的数据
offset 读取的起始位置, 默认为0
s = b'hello world'
a10 = np.frombuffer(s, dtype='S1')
print(a10) '''
[b'h' b'e' b'l' b'l' b'o' b' ' b'w' b'o' b'r' b'l' b'd']
'''

numpy.fromiter

  • 从可迭代对象中建立ndarray对象, 返回一维数组.
numpy.fromiter(iterable, dtype, count=-1)
list2 = range(5)
# it = iter(list2)
a11 = np.fromiter(list2, dtype=float)
print(a11) # [0. 1. 2. 3. 4.]

从数值范围创建数组

numpy.arange

  • 创建数值范围并返回ndarray对象
numpy.arange(start, stop, step, dtype)

# 起始值, 默认为0
# 终止值, 不包含
# 步长, 默认为1
# 返回ndarray的数据类型, 如果没有提供, 则使用输入数据的类型
x11 = np.arange(6)
print(x11)
# [0 1 2 3 4 5] # 设置返回类型为float
x12 = np.arange(6, dtype=float)
print(x12)
# [0. 1. 2. 3. 4. 5.] # 设置起始值, 终止值及步长
x13 = np.arange(10, 20, 2)
print(x13)
# [10 12 14 16 18]

numpy.linspace

  • 用于创建一个一维数组, 数组是一个等差数列构成的
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数 描述
start 序列的起始值
stop 序列的终止值
num 要生成的等差数列的样本的数量, 默认为50
endpoint 为True时, 数列中包含stop值, 反之不包含, 默认为True
retstep 为True时, 生成的数组会显示间距, 反之不显示
dtype ndarray的数据类型
b1 = np.linspace(1, 10, 10)
print(b1)
# [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.] # 设置元素全部是1的等差数列
b2 = np.linspace(1, 1, 10)
print(b2)
# [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] # 设置endpoint为False, 不包含终止值
b3 = np.linspace(10, 20, 5, endpoint=False)
print(b3)
# [10. 12. 14. 16. 18.] # 设置间距
b4 = np.linspace(1, 10, 10, retstep=True)
print(b4)
# (array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), 1.0) # 扩展
b5 = np.linspace(1, 10, 10).reshape(10, 1)
print(b5)
'''
[[ 1.]
[ 2.]
[ 3.]
[ 4.]
[ 5.]
[ 6.]
[ 7.]
[ 8.]
[ 9.]
[10.]]
'''

numpy.logspace

  • 用于创建一个等比数列
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
参数 描述
start 序列的起始值: base ** start
stop 序列的终止值: base ** stop
num 要生成的等步长的样本的数量值, 默认为50
endpoint 为true时, 数列中包含stop值, 反之不包含
base 对数log的底数
dtype ndarray的数据类型

# 默认底数是10
b6 = np.logspace(1.0, 2.0, num=10)
print(b6)
'''
[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]
''' # 将底数设置为2
b7 = np.logspace(0, 9, 10, base=2)
print(b7)
'''
[ 1. 2. 4. 8. 16. 32. 64. 128. 256. 512.]
'''

切片和索引

  • 通过索引和切片访问和修改ndarray对象的内容, 索引下标从0开始, 切片对象通过内置函数slice设置start, stop及step参数, 从而切割出一个新数组,

  • 也可以通过冒号分隔切片参数 start: stop: step来进行切片操作

b8 = np.arange(10)
s1 = slice(2, 7, 2)
print(b8[s1])
# [2 4 6] print(b8[2:7:2])
# [2 4 6] print(b8[5])
# 5 print(b8[2:])
# [2 3 4 5 6 7 8 9] print(b8[2:5])
# [2 3 4]
  • 多维数组同样适用上述索引提取方法
a20 = np.array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])
print(a20)
print('从数组索引 a20[1:] 处开始切割')
print(a20[1:]) '''
[[1 2 3]
[3 4 5]
[4 5 6]]
从数组索引 a20[1:] 处开始切割
[[3 4 5]
[4 5 6]]
'''
  • 切片还可以包括省略号..., 来使选择元组的长度与数组的维度相同.
print(a20[..., 1])
[2 4 5] print(a20[1, ...])
print('*' * 20)
print(a20[..., 1:])
'''
[3 4 5]
********************
[[2 3]
[4 5]
[5 6]]
'''

高级索引

整数数组索引

# 获取数据中(0, 0), (1, 1)和(2, 0)位置处的元素
x20 = np.array([[1, 2], [3, 4], [5, 6]])
y20 = x20[[0, 1, 2], [0, 1, 0]]
print(y20)
# [1 4 5] x21 = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('数组为:\n{}\n'.format(x21)) rows = np.array([[0, 0], [3, 3]])
cols = np.array([[0, 2], [0, 2]])
y21 = x21[rows, cols]
print('这个数组的四个角元素:\n{}'.format(y21)) '''
数组为:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]] 这个数组的四个角元素:
[[ 0 2]
[ 9 11]]
''' a0 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b0 = a0[1:3, 1:3]
c0 = a0[1:3, [1, 2]]
d0 = a0[..., 1:]
print(a0)
print('*' * 30)
print(b0)
print('*' * 30)
print(c0)
print('*' * 30)
print(d0) '''
[[1 2 3]
[4 5 6]
[7 8 9]]
******************************
[[5 6]
[8 9]]
******************************
[[5 6]
[8 9]]
******************************
[[2 3]
[5 6]
[8 9]]
'''

布尔索引

  • 通过一个布尔数组来索引目标数组.
# 获取大于5的元素
print(x21[x21 > 5])
# [ 6 7 8 9 10 11] # 使用 ~ 取补运算符来过滤NaN
a20 = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
print(a20)
print(a20[~np.isnan(a20)])
'''
[nan 1. 2. nan 3. 4. 5.]
[1. 2. 3. 4. 5.]
''' a21 = np.array([1, 2+6j, 5, 3.5+5j])
print(a21[np.iscomplex(a21)])
# [2. +6.j 3.5+5.j]

花式索引

  • 利用整数数组进行索引, 根据索引数组的值作为目标数组某个轴的下标来取值.
  • 如果使用一维整型数组作为索引, 且目标数组也是一维数组, 索引的结果就是对应位置的元素; 如果目标数组是二维数组, 那就是对应下标的行.
  • 花式索引是将数据复制到新数组中.
# 传入顺序索引数组
import numpy as np
x31 = np.arange(32).reshape(8, 4)
print(x31)
print('-' * 20)
print(x31[[4, 2, 1, 7]])
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
--------------------
[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]
''' # 传入倒序索引数组
print(x31[[-4, -2, -1, -7]])
'''
[[16 17 18 19]
[24 25 26 27]
[28 29 30 31]
[ 4 5 6 7]]
''' # 传入多个索引数组, 使用np.ix_
print(x31[np.ix_([1, 5, 7, 2],[0, 3, 1, 2])])
'''
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
'''

numpy---(上)的更多相关文章

  1. 科学计算 NumPy 与C语言对比 N-dimensional array ndarray 元素元素操作 计算正太分布分位数

    w http://www.numpy.org/ NumPy is the fundamental package for scientific computing with Python. It co ...

  2. python-数据处理的包Numpy,scipy,pandas,matplotlib

    一,NumPy包(numeric python,数值计算) 该包主要包含了存储单一数据类型的ndarry对象的多维数组和处理数组能力的函数ufunc对象.是其它包数据类型的基础.只能处理简单的数据分析 ...

  3. numpy安装失败-小失误

    1. 古老的方法:            安装python numpy库AMD64 失败,网上的教程是这样的:http://www.cnblogs.com/zhuyp1015/archive/2012 ...

  4. 转--python 基础

    核心库 1.NumPy 当我们用python来处理科学计算任务时,不可避免的要用到来自SciPy  Stack的帮助.SciPy Stack是一个专为python中科学计算而设计的软件包,注意不要将它 ...

  5. Anaconda详细安装使用教程

    版权声明:本文为博主原创文章,欢迎大家转载,但是要注明我的文章地址. https://blog.csdn.net/program_developer/article/details/79677557 ...

  6. h5py库安装问题解决

    H5py官网教程完全有问题,这个大家都这么说,但是貌似问题出现在Numpy上,由于numpy的版本过高! 这里是官网的教程:http://docs.h5py.org/en/latest/build.h ...

  7. python Anaconda

    转载自   https://blog.csdn.net/program_developer/article/details/79677557 目录: Anaconda是什么? 如何安装? 如何管理包? ...

  8. Python可视化库

    转自小小蒲公英原文用Python可视化库 现如今大数据已人尽皆知,但在这个信息大爆炸的时代里,空有海量数据是无实际使用价值,更不要说帮助管理者进行业务决策.那么数据有什么价值呢?用什么样的手段才能把数 ...

  9. linux下搭建python机器学习环境

    前言 在 linux 下搭建 python 机器学习环境还是比较容易的,考虑到包依赖的问题,最好建立一个虚拟环境作为机器学习工作环境,在建立的虚拟环境中,再安装各种需要的包,主要有以下6个(这是看这个 ...

  10. 2017年排名前15的数据科学python库

    2017年排名前15的数据科学python库 2017-05-22 Python程序员 Python程序员 Python程序员 微信号 pythonbuluo 功能介绍 最专业的Python社区,有每 ...

随机推荐

  1. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

  2. SignalR 入门 .netCore实现聊天室

    SignalR 入门 .netCore实现聊天室 本文根据微软SignalR 简介 | Microsoft Docs 和 ASP.NET Core SignalR 简介 | Microsoft Doc ...

  3. app自动化toast信息获取

    移动端测试比较常遇到toast类型的提示信息,那么对于这类信息我们要怎么获取呢,让我细细道来: 首先,获取toast信息要注意以下几点: 必须是Uiautomator2框架,设备配置参数中设置 &qu ...

  4. go语言学习入门篇 3-- 程序执行流程

    先看下 Go 语言的程序结构: package main // 当前包名 import "fmt" // 导入程序中使用到的包 // 初始化函数 func init() { // ...

  5. sql注入之简要注入

    #mysql简要注入流程 mysql注入简要流程如下图: 由于还没学习完先结合sqlilabs的第一关讲解信息收集的一部分和数据注入的information_schema的有据查询. #sqli-la ...

  6. Linux下面有7个运行等级  run level

    Linux下面有7个运行等级  run level run level 0  系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 run level 1  单用户工作状态,root权限,用于系 ...

  7. 1分钟为Win10瘦身!把吃掉的硬盘找回来

    很多小伙伴升级完Win10后都发现C盘变小了,不少人以为这大概就是Win10太占磁盘空间了.但事实上,Win10和以前的操作系统一样,对于C盘空间并没有什么太高要求.出现这个问题的主要原因,是Win1 ...

  8. CF1485X Codeforces Round #701

    D Multiples and Power Differences (构造) 题目大意:给一个n*m的矩阵a,a[i][j]在1到16之间.现在要构造矩阵b,需要满足如下条件: 1.b[i][j]在1 ...

  9. Git常见错误整理

    参考文章 git 排错 fatal: 'git status --porcelain' failed in submodule abi/cpp 1 fatal: 'git status --porce ...

  10. Vscode的使用小技巧

    命令行启动code 如果你的系统是Linux系统(我使用的是Ubuntu 16.04)这样就可以直接使用 code + filename来编辑文件(就像vi + filename) 如果你的系统是Ma ...