Numpy 中文用户指南 3.2 创建数组

微服务部落
• 阅读 3202

原文:Array creation

译者:飞龙

另见

数组创建例程

导言

数组创建的一般机制有五种:

  • 从其它Python的结构转换(如列表和元组)

  • 内置的NumPy数组创建对象(如 arange, ones, zeros以及其它)

  • 从磁盘中读取标准或自定义格式的数据

  • 通过使用字符串或者缓冲区,从原始的字节创建数组

  • 使用特殊的库函数(比如random

本节不会涉及复制和连接等扩展和转换现有数组的方法,也不会涉及创建对象数组和结构化数组。这些会在它们自己的章节中讲述。

将Python类似数组的对象转换为NumPy数组

通常,Python中排列为数组结构的数值数据可以通过array()函数来转换成数组,典型的例子就是列表和元组。具体使用方法请见array()函数的文档。一些对象也支持数组的协议,并且可以用这种方法转换成数组。辨识一个对象是否能转换为数组,最简单的方法就是在交互式环境中尝试这一方法,看看它是否有效(即Python之道)。

例如:

>>> x = np.array([2,3,1,0])
>>> x = np.array([2, 3, 1, 0])
>>> x = np.array([[1,2.0],[0,0],(1+1j,3.)]) # note mix of tuple and lists,
    and types
>>> x = np.array([[ 1.+0.j, 2.+0.j], [ 0.+0.j, 0.+0.j], [ 1.+1.j, 3.+0.j]])

内置的NumPy数组创建

NumPy具有从无到有创建数组的内置功能:

zeros(shape) 将创建一个填充为0的指定形状的数组。

>>> np.zeros((2, 3)) array([[ 0., 0., 0.], [ 0., 0., 0.]])

ones(shape) 将创建一个填充为1的数组。在其他所有方面都和zeros相同。

arange()将创建有规律的增量值数组。它的几种用法请见docstring。这里给出几个例子:

>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(2, 10, dtype=np.float)
array([ 2., 3., 4., 5., 6., 7., 8., 9.])
>>> np.arange(2, 3, 0.1)
array([ 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])

请注意,关于最后一个用例,有一些使用技巧,请见arrange的docstring。

linspace()将以指定数量的元素创建数组,并平分开始值和结束值。例如:

>>> np.linspace(1., 4., 6)
array([ 1. ,  1.6,  2.2,  2.8,  3.4,  4. ])

这些创建函数的好处是,可以保证元素个数、起始点和结束点,arange()一般不会指定任意的起始值、结束值和步长。

indices()将创建数组的集合(用一维数组来模拟高维数组),每一维都有表示它的变量。一个例子说明比口头描述好得多:

>>> np.indices((3,3))
array([[[0, 0, 0], [1, 1, 1], [2, 2, 2]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]])

计算规则网格上的高维函数时,这会非常有用。

从磁盘读取数组

这大概是大数组创建的最常见情况。当然,细节取决于磁盘上的数据格式,所以这一节只能给出如何处理各种格式的一般建议。

标准二进制格式

各个领域都有数组数据的标准格式。以下列出了用于读取和返回NumPy数组的已知Python库(也有其它的库可以读取数组并转换为NumPy数组,所以也请看一下最后一节)

HDF5: PyTables
FITS: PyFITS

一些格式不能直接读取,但是不难将其转换为类似PIL库(能够读写许多图像格式,例如jpg、png以及其它)所支持的格式。

普通的ASCII格式

逗号分隔值文件(CSV)被广泛使用(可以被类似Excel的一些程序导入导出)。有一些在python中读取这些文件的方法,例如Python和pylab(Matplotlib的一部分)中的函数。

更通用的ASCII文件可以使用SciPy的IO包来读取。

自定义二进制格式

有多种方法可以使用。如果文件有一个相对简单的格式,那么你可以写一个简单的I/O库并使用numpy fromfile()tofile()方法直接读写NumPy数组(注意字节顺序!)。如果有一个不错的C/C++库可以用于读取数据,则可以用各种技巧把它封装一下,虽然这可能要耗费一些工作量,也需要更多高级的知识来和C/C++交互。

特殊库的使用

有一些库可以用于生成特殊用途的数组,这样的库不可能全部列举出来。最常见的用法是使用许多数组生成函数来产生带有随机值的数组,以及使用一些生成特殊矩阵(如对角线)的功能函数。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这