3.numpy_array数组
官方文档:www.numpy.org.cn
Numpy 数组及其索引
先导入numpy:
from numpy import *
产生数组
从列表产生数组:
lst = [0, 1, 2, 3]
a = array(lst)
a
array([0, 1, 2, 3])
或者直接将列表传入:
a = array([1, 2, 3, 4])
a
array([1, 2, 3, 4])
数组属性
查看类型:
type(a)
numpy.ndarray
查看数组中的数据类型:
# 32比特的整数
a.dtype
dtype('int32')
查看每个元素所占的字节:
a.itemsize
4
查看形状,会返回一个元组,每个元素代表这一维的元素数目:
# 1维数组,返回一个元组
a.shape
(4L,)
或者使用:
shape(a)
(4L,)
shape 的使用历史要比 a.shape 久,而且还可以作用于别的类型:
lst = [1,2,3,4]
shape(lst)
(4L,)
查看元素数目:
a.size
4
size(a)
4
查看所有元素所占的空间:
a.nbytes
16
但事实上,数组所占的存储空间要比这个数字大,因为要用一个header来保存shape,dtype这样的信息。
查看数组维数:
a.ndim
1
使用fill方法设定初始值
可以使用 fill 方法将数组设为指定值:
a.fill(-4.8)
a
array([-4, -4, -4, -4])
但是与列表不同,数组中要求所有元素的 dtype 是一样的,如果传入参数的类型与数组类型不一样,需要按照已有的类型进行转换。
索引与切片
和列表相似,数组也支持索引和切片操作。
索引第一个元素:
a = array([0, 1, 2, 3])
a[0]
0
修改第一个元素的值:
a[0] = 10
a
array([10, 1, 2, 3])
切片,支持负索引:
a = array([11,12,13,14,15])
a[1:3]
array([12, 13])
a[1:-2]
array([12, 13])
a[-4:3]
array([12, 13])
省略参数:
a[::2]
array([11, 13, 15])
a[-2:]
array([14, 15])
假设我们记录一辆汽车表盘上每天显示的里程数:
od = array([21000, 21180, 21240, 22100, 22400])
可以这样计算每天的旅程:
dist = od[1:] - od[:-1]
dist
array([180, 60, 860, 300])
在本质上,Python会将array的各种计算转换为类似这样的C代码:
int compute_sum(int *arr, int N) {
int sum = 0;
int i;
for (i = 0; i < N; i++) {
sum += arr[i];
}
return sum;
}
多维数组及其属性
array 还可以用来生成多维数组:
a = array([[ 0, 1, 2, 3],
[10,11,12,13]])
a
array([[ 0, 1, 2, 3],
[10, 11, 12, 13]])
事实上我们传入的是一个以列表为元素的列表,最终得到一个二维数组。
甚至可以扩展到3D或者4D的情景。
查看形状:
a.shape
(2L, 4L)
这里2代表行数,4代表列数。
查看总的元素个数:
# 2 * 4 = 8
a.size
8
查看维数:
a.ndim
2
多维数组索引
对于二维数组,可以传入两个数字来索引:
a[1, 3]
13
其中,1是行索引,3是列索引,中间用逗号隔开,事实上,Python会将它们看成一个元组(1,3),然后按照顺序进行对应。
可以利用索引给它赋值:
a[1, 3] = -1
a
array([[ 0, 1, 2, 3],
[10, 11, 12, -1]])
事实上,我们还可以使用单个索引来索引一整行内容:
# 返回第二行元组组成的array
a[1]
array([10, 11, 12, -1])
Python会将这单个元组当成对第一维的索引,然后返回对应的内容。
多维数组切片
多维数组,也支持切片操作:
a = array([[ 0, 1, 2, 3, 4, 5],
[10,11,12,13,14,15],
[20,21,22,23,24,25],
[30,31,32,33,34,35],
[40,41,42,43,44,45],
[50,51,52,53,54,55]])
a
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
想得到第一行的第 4 和第 5 两个元素:
a[0, 3:5]
array([3, 4])
得到最后两行的最后两列:
a[4:, 4:]
array([[44, 45],
[54, 55]])
得到第三列:
a[:, 2]
array([ 2, 12, 22, 32, 42, 52])
每一维都支持切片的规则,包括负索引,省略:
[lower:upper:step]
例如,取出3,5行的奇数列:
a[2::2, ::2]
array([[20, 22, 24],
[40, 42, 44]])
切片是引用
切片在内存中使用的是引用机制。
a = array([0,1,2,3,4])
b = a[2:4]
print b
[2 3]
引用机制意味着,Python并没有为 b 分配新的空间来存储它的值,而是让 b 指向了 a 所分配的内存空间,因此,改变 b 会改变 a 的值:
b[0] = 10
a
array([ 0, 1, 10, 3, 4])
而这种现象在列表中并不会出现:
a = [1,2,3,4,5]
b = a[2:3]
b[0] = 13234
print a
[1, 2, 3, 4, 5]
这样做的好处在于,对于很大的数组,不用大量复制多余的值,节约了空间。
缺点在于,可能出现改变一个值改变另一个值的情况。
一个解决方法是使用copy()方法产生一个复制,这个复制会申请新的内存:
a = array([0,1,2,3,4])
b = a[2:4].copy()
b[0] = 10
a
array([0, 1, 2, 3, 4])
花式索引
切片只能支持连续或者等间隔的切片操作,要想实现任意位置的操作,需要使用花式索引 fancy slicing 。
一维花式索引
与 range 函数类似,我们可以使用 arange 函数来产生等差数组。
a = arange(0, 80, 10)
a
array([ 0, 10, 20, 30, 40, 50, 60, 70])
花式索引需要指定索引位置:
indices = [1, 2, -3]
y = a[indices]
print y
[10 20 50]
还可以使用布尔数组来花式索引:
mask = array([0,1,1,0,0,1,0,0],
dtype=bool)
a[mask]
array([10, 20, 50])
或者用布尔表达式生成 mask,选出了所有大于0.5的值:
from numpy.random import rand
a = rand(10)
a
array([ 0.37214708, 0.48594733, 0.73365131, 0.15769295, 0.30786017,
0.62068734, 0.36940654, 0.09424167, 0.53085308, 0.12248951])
mask = a > 0.5
a[mask]
array([ 0.73365131, 0.62068734, 0.53085308])
mask 必须是布尔数组。
二维花式索引
a = array([[ 0, 1, 2, 3, 4, 5],
[10,11,12,13,14,15],
[20,21,22,23,24,25],
[30,31,32,33,34,35],
[40,41,42,43,44,45],
[50,51,52,53,54,55]])
a
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
对于二维花式索引,我们需要给定 row 和 col 的值:
a[(0,1,2,3,4), (1,2,3,4,5)]
array([ 1, 12, 23, 34, 45])
返回的是一条次对角线上的5个值。
a[3:, [0,2,5]]
array([[30, 32, 35],
[40, 42, 45],
[50, 52, 55]])
返回的是最后三行的第1,3,5列。
也可以使用mask进行索引:
mask = array([1,0,1,0,0,1],
dtype=bool)
a[mask, 2]
array([ 2, 22, 52])
与切片不同,花式索引返回的是原对象的一个复制而不是引用。
“不完全”索引
只给定行索引的时候,返回整行:
y = a[:3]
y
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25]])
这时候也可以使用花式索引取出第2,3,5行:
condition = array([0,1,1,0,1],
dtype=bool)
a[condition]
array([[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[40, 41, 42, 43, 44, 45]])
三维花式索引
a = arange(64)
a.shape = 4,4,4
a
array([[[ 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]],
[[32, 33, 34, 35],
[36, 37, 38, 39],
[40, 41, 42, 43],
[44, 45, 46, 47]],
[[48, 49, 50, 51],
[52, 53, 54, 55],
[56, 57, 58, 59],
[60, 61, 62, 63]]])
y = a[:,:,[2, -1]]
y
array([[[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]],
[[18, 19],
[22, 23],
[26, 27],
[30, 31]],
[[34, 35],
[38, 39],
[42, 43],
[46, 47]],
[[50, 51],
[54, 55],
[58, 59],
[62, 63]]])
where语句
where(array)
where 函数会返回所有非零元素的索引。
一维数组
先看一维的例子:
a = array([0, 12, 5, 20])
判断数组中的元素是不是大于10:
a > 10
array([False, True, False, True], dtype=bool)
数组中所有大于10的元素的索引位置:
where(a > 10)
(array([1, 3], dtype=int64),)
注意到 where 的返回值是一个元组。
使用元组是由于 where 可以对多维数组使用,此时返回值就是多维的。
在使用的时候,我们可以这样:
indices = where(a > 10)
indices = indices[0]
indices
array([1, 3], dtype=int64)
或者:
indices = where(a>10)[0]
indices
array([1, 3], dtype=int64)
可以直接用 where 的返回值进行索引:
loc = where(a > 10)
a[loc]
array([12, 20])
多维数组
考虑二维数组:
a = array([[0, 12, 5, 20],
[1, 2, 11, 15]])
loc = where(a > 10)
返回结果是一个二维的元组,每一维代表这一维的索引值:
loc
(array([0, 0, 1, 1], dtype=int64), array([1, 3, 2, 3], dtype=int64))
也可以直接用来索引a:
a[loc]
array([12, 20, 11, 15])
或者可以这样:
rows, cols = where(a>10)
rows
array([0, 0, 1, 1], dtype=int64)
cols
array([1, 3, 2, 3], dtype=int64)
a[rows, cols]
array([12, 20, 11, 15])
再看另一个例子:
a = arange(25)
a.shape = 5,5
a
array([[ 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]])
a > 12
array([[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True]], dtype=bool)
where(a > 12)
(array([2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4], dtype=int64),
array([3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))
3.numpy_array数组的更多相关文章
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...
- javascript数组查重方法总结
文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
随机推荐
- win10中命令操作Zookeeper
目录 zk客户端命令: 连接: 命令: 四字命令: 常用命令: 返回参数说明: 参考: zk客户端命令: 连接: C:\Users\qhong\Desktop $ zkCli.cmd -server ...
- CentOS7.2 安装Docker
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname -r 命令查看你当前的内核版本 [roo ...
- 洛谷P2637第一次,第二次,成交! 模拟?DP?
今天水来一天,就贴道水吧.. 原题>>https://www.luogu.org/problem/show?pid=2637<< 题目描述 因为奶牛们的节食运动(奶牛还节食?) ...
- vue--存储
storage 一个存储库,它支持具有相同 api 的 sessionStorage 和 localStorage 安装和用法: storage 的 API: set(key,val) 用key和va ...
- Codeforces 767E Change-free
题目链接:http://codeforces.com/contest/767/problem/E 居然是一个瞎几把贪心(E比B水系列) 考虑要每一次操作至少要用${\left \lfloor \fra ...
- 常见的Java面试题及答案整理
1. 基础篇 1. 面向对象特征:封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在 Java 当中,有 3 种修饰符: p ...
- Ubuntu18.04的网络配置
网卡与DNS配置 1)打开命令窗口(右键单机桌面选择Open Terminal或者用快捷键Ctrl+Alt+T打开终端),输入ip a查看自己的网卡编号 2)输入命令sudo vim /etc/net ...
- Given d and e, factorize N to attack RSA
题目如下: RSA算法的使用一般要求每个不同的用户有一个独立的模数N.有天,Bob脑洞大开,认为似乎没有必要这样做.只需要一个模数N,然后给不同的用户分发不同的e和d就好了.可惜这种做法有严重的安全漏 ...
- PSFTP用法
PSFTP是PuTTY SFTP客户端,用于本地与服务器间安全传输文件(使用SSH连接). 1. 启动PSFTP 在Windows命令提示符中输入 set PATH=C:/PSFTP.exe所在路径; ...
- maven配置环境变量失败解决办法
配置maven路径什么的统统正确,最后测hi不成功.在网上搜索了好多资料方法都解不了 具体问题具体对待吧,如果有和我类似的小伙伴,可以尝试一下我的这个办法,在maven路径后面加/bin path变量 ...