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. 华为交换机配置ACL详细步骤

    ACL 介绍 #2000-2999普通ACL,根据源IP过滤 #3000-3999高级ACL,根据源目的端口和源目的地址等过滤 #4000-4999二层ACL,根据源目的MAC等过滤 配置举例: 拒绝 ...

  2. 理解HMM算法

    长这样: 理解的前提: (1)状态:生成观测值的变量(上图中的"吃"和"睡"). (2)观测值:状态乘上输出概率对应的输出(上图中的橙色节点). (3)输出概率 ...

  3. 记录Markdown的学习

    目录 1. 引言 2. 标题 这是一级标题 这是二级标题 这是三级标题 这是四级标题 3. 文字相关 3.1 粗体 3.2 斜体 3.3 粗体和斜体 3.4 删除线 3.5 混合使用 3.6 反引号引 ...

  4. BUAA 2021-2022毛概复习资料

    2021-2022年毛概期末主观题复习范围,参考2022版教材和课程组官方PPT,原文太过敏感,所以贴出代码大家自己run #include <stdio.h> unsigned arti ...

  5. SpringBoot+Vue+mysql 搭建(一)

    一.创建Spring boot maven 项目 Spring initializr 是Spring 官方提供的一个用来初始化一个Spring boot 项目的工具. 在idea中,直接 File-& ...

  6. SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(转载)

    SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本) 转载请标明出处:http://blog.csdn.net/forezp/article/details ...

  7. Spring MVC的异常处理 ?

    可以将异常抛给Spring框架,由Spring框架来处理:我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可.

  8. Kafka创建Topic时如何将分区放置到不同的Broker中?

    副本因子不能大于 Broker 的个数: 第一个分区(编号为0)的第一个副本放置位置是随机从 brokerList 选择的: 其他分区的第一个副本放置位置相对于第0个分区依次往后移.也就是如果我们有5 ...

  9. awk 详解?

    awk '{pattern + action}' {filenames} #cat /etc/passwd |awk -F ':' '{print 1"\t"7}' //-F 的意 ...

  10. JDBC 中如何进行事务处理?

    Connection 提供了事务处理的方法,通过调用 setAutoCommit(false)可以设置 手动提交事务:当事务完成后用 commit()显式提交事务:如果在事务处理过程中 发生异常则通过 ...