NumPy 学习(2): 数组的操作
1. 简单一维数组的操作
一维数组的操作类似于python自身的list类型。
In [14]: arr = np.arange(10) In [15]: arr
Out[15]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 第六个元素值
In [16]: arr[5]
Out[16]: 5
# 第6,,7,8这三个元素的值
In [17]: arr[5:8]
Out[17]: array([5, 6, 7])
注意: 和list类型有很大的不同的是,操作原数组的子序列的时候,实际上就是操作原数组的数据。这就意味着数组中的数据没有被复制,任何在其子序列上的操作都会映射到原数组上。这是因为NumPy是被设计成处理大量数据的工具,如果采用复制的方式,其计算性能会大大折扣。
In [18]: arr_slice = arr[:4] In [19]: arr_slice[:] = 20 In [20]: arr_slice
Out[20]: array([20, 20, 20, 20])
# arr_slice中更改映射到了arr中
In [21]: arr
Out[21]: array([20, 20, 20, 20, 4, 5, 6, 7, 8, 9])
如果要执行显示的复制操作可以通过条用copy()函数: arr[:3].copy
2. 高维维数组上的操作
2.1 二维数组索引访问:
# 产生1-9的数
In [28]: arr2d = np.arange(1,10).reshape((3,3)) In [29]: arr2d
Out[29]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 访问第一行数据
In [30]: arr2d[0]
Out[30]: array([1, 2, 3])
# 访问第一行第二个数据
In [31]: arr2d[0][1]
Out[31]: 2 In [32]: arr2d[0,1]
Out[32]: 2
2.2 以划分(slice)的方式来取得部分数据:
2.3 索引(index)访问和划分(slice)的不同
索引是通过坐标定位数据的位置并获取其值,arr2d[[0,1],[0,1]] 实际上是获取(0,0),(1,1)位置上的数据,是获取交汇点上的数据。
划分是将设定范围的数据提取出来,arr2d[:2, :2]实际上就是把1-2行与1-2列中的数据划分出来,是一个区域。
In [67]: arr2d = np.arange(1,10).reshape(3,3)
# 划分的方式划分数据
In [68]: arr2d[:2, :2]
Out[68]:
array([[1, 2],
[4, 5]])
# 以索引方式访问数据
In [69]: arr2d[[0,1],[0,1]]
Out[69]: array([1, 5])
将8 * 4 的一个二维数组的1,3,5,7行,和 4,3,2,1列重新组成一个二维数组。如果用以下方法,肯定是不行的:
In [71]: arr = np.arange(32).reshape(8,4) In [72]: arr
Out[72]:
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]])
# 错误的做法,其实是获取(0,3),(2,2),(4,1),(6,0)位置上的值
In [73]: arr[[0,2,4,6],[3,2,1,0]]
Out[73]: array([ 3, 10, 17, 24])
正确的方法:
# 先获取1,3,5,7行的数据
In [74]: arr_temp = arr[[0,2,4,6]] In [75]: arr_temp
Out[75]:
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11],
[16, 17, 18, 19],
[24, 25, 26, 27]])
# 划分数组,并组成新的数组
In [76]: arr_temp[:,[3,2,1,0]]
Out[76]:
array([[ 3, 2, 1, 0],
[11, 10, 9, 8],
[19, 18, 17, 16],
[27, 26, 25, 24]])
实现此功能还可以调用np.ix_() 函数:
In [77]: arr[np.ix_([0,2,4,6],[3,2,1,0])]
Out[77]:
array([[ 3, 2, 1, 0],
[11, 10, 9, 8],
[19, 18, 17, 16],
[27, 26, 25, 24]])
2.4 高维数组访问:
# 用reshape生成三维数组
In [33]: arr3d = np.arange(1,13).reshape((2,2,3)) In [34]: arr3d
Out[34]:
array([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]]])
# 用传统的array函数生成三维数组
In [35]: arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) In [36]: arr3d
Out[36]:
array([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]]])
# arr3d[0]是一个2*3的数组
In [37]: arr3d[0]
Out[37]:
array([[1, 2, 3],
[4, 5, 6]])
# arr3d[0,0]是一个一维数组
In [38]: arr3d[0,0]
Out[38]: array([1, 2, 3]) In [39]: arr3d[0,0,0]
Out[39]: 1
2.5 数组赋值操作:
# 第一个2 * 3 数组的值全变为 32
In [40]: arr3d[0] = 32 In [41]: arr3d
Out[41]:
array([[[32, 32, 32],
[32, 32, 32]], [[ 7, 8, 9],
[10, 11, 12]]]) In [42]: old_values = arr3d[0]
# 将一个2 *3 的数组赋给arr3d[0]
In [43]: arr3d[0] = old_values In [44]: arr3d
Out[44]:
array([[[32, 32, 32],
[32, 32, 32]], [[ 7, 8, 9],
[10, 11, 12]]])
3. 布尔索引
数据准备:
# 七个名字
In [2]: names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']) In [3]: names
Out[3]:
array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'],
dtype='|S4')
# 生成7行,4列的随机数组,每一行对应names中一个人的数据
In [4]: data = randn(7,4) In [5]: data
Out[5]:
array([[ 0.54643196, 0.98876451, 1.55499825, 1.88240798],
[ 1.39695977, -1.59576937, 0.42445372, 1.73588157],
[ 0.61992879, -0.13706965, 1.87869165, 1.28724149],
[ 0.59114346, -0.50032077, 1.29182197, 0.54644327],
[ 0.59344412, -0.06566168, -0.01759809, 0.22191015],
[-1.57663889, -0.08607805, -0.36048361, -0.94029737],
[-0.32203015, 0.59462972, 1.10737098, -1.9473386 ]])
用布尔数组筛选二维数组的行,布尔数组的大小和二维数组的行数要相同
In [12]: names=="Bob"
Out[12]: array([ True, False, False, True, False, False, False], dtype=bool)
# 选取 Bob 的数据
In [13]: data[names == "Bob"]
Out[13]:
array([[ 0.54643196, 0.98876451, 1.55499825, 1.88240798],
[ 0.59114346, -0.50032077, 1.29182197, 0.54644327]])
布尔索引和普通索引混合使用:
In [13]: data[names == "Bob"]
Out[13]:
array([[ 0.54643196, 0.98876451, 1.55499825, 1.88240798],
[ 0.59114346, -0.50032077, 1.29182197, 0.54644327]]) In [14]: data[names == "Bob",2:]
Out[14]:
array([[ 1.55499825, 1.88240798],
[ 1.29182197, 0.54644327]])
“与或非“操作。 python 中的 and , or 等关键字在这里不能实现
# 或操作
In [20]: (names == 'Bob') | (names == 'Will')
Out[20]: array([ True, False, True, True, True, False, False], dtype=bool)
# 与操作
In [21]: (names == 'Bob') & (names == 'Will')
Out[21]: array([False, False, False, False, False, False, False], dtype=bool)
# 下边两种 非操作
In [22]: names != "Bob"
Out[22]: array([False, True, True, False, True, True, True], dtype=bool) In [23]: -(names == "Bob")
Out[23]: array([False, True, True, False, True, True, True], dtype=bool)
二维布尔类型索引:
In [24]: data < 0
Out[24]:
array([[False, False, False, False],
[False, True, False, False],
[False, True, False, False],
[False, True, False, False],
[False, True, True, False],
[ True, True, True, True],
[ True, False, False, True]], dtype=bool)
# 将小于0的元素的值改为0
In [25]: data[ data < 0] = 0 In [26]: data
Out[26]:
array([[ 0.54643196, 0.98876451, 1.55499825, 1.88240798],
[ 1.39695977, 0. , 0.42445372, 1.73588157],
[ 0.61992879, 0. , 1.87869165, 1.28724149],
[ 0.59114346, 0. , 1.29182197, 0.54644327],
[ 0.59344412, 0. , 0. , 0.22191015],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0.59462972, 1.10737098, 0. ]])
NumPy 学习(2): 数组的操作的更多相关文章
- Numpy学习之——数组创建
Numpy学习之--数组创建 过程展示 import numpy as np a = np.array([2,3,9]) a array([2, 3, 9]) a.dtype dtype('int32 ...
- Scala学习(三)----数组相关操作
数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...
- PHP学习之数组Array操作和键值对操作函数(一)
PHP 中的数组实际上是一个有序映射.映射是一种把 values关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合, ...
- Scala学习三——数组相关操作
一.若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer 固定长度数组: 如val nums=new Array[Int](10) //10个整型数组,所有元素初始化为0; val ...
- 【NumPy学习指南】day5 改变数组的维度
我们已经学习了怎样使用reshape函数,现在来学习一下怎样将数组展平. (1) ravel 我们可以用ravel函数完成展平的操作: In: b Out: array([[[ 0, 1, 2, 3] ...
- 【学习笔记】 第04章 NumPy基础:数组和矢量计算
前言 正式开始学习Numpy,参考用书是<用Python进行数据清洗>,计划本周五之前把本书读完,关键代码全部实现一遍 NumPy基础:数组和矢量计算 按照书中所示,要搞明白具体的性能差距 ...
- [jQuery学习系列二 ]2-JQuery学习二-数组操作
前言 上一篇内容 已经对于Jquery 有了一些认识, 包括Jquery的选择器和DOM对象, 那么这一篇继续来看下Jquery中很实用的Jquery对于数组的操作. Jquery中对数组的操作大致有 ...
- 【NumPy学习指南】day4 多维数组的切片和索引
ndarray支持在多维数组上的切片操作.为了方便起见,我们可以用一个省略号(...)来 表示遍历剩下的维度. (1) 举例来说,我们先用arange函数创建一个数组并改变其维度,使之变成一个三维数组 ...
- numpy学习笔记 - numpy常用函数、向量化操作及基本数学统计方法
# -*- coding: utf-8 -*-"""主要记录代码,相关说明采用注释形势,供日常总结.查阅使用,不定时更新.Created on Fri Aug 24 19 ...
随机推荐
- 使用Apache+Dreamweaver(或者H-builder)搭建php开发环境
使用得工具说明 php+Apache服务器+Dreamweaver+mysql数据库 下载安装好wamp,可以在网上直接百度下载,为了方便,我给放个百度云的链接.wamp下载:链接:http://pa ...
- iOS 全局禁止横屏,但UIWebView 全屏播放视频,横屏,解决办法(任意页面横竖屏或禁止)
iOS 全局禁止横屏,但UIWebView 全屏播放视频,横屏,解决办法 时间 2015-07-14 20:59:00 博客园-原创精华区 原文 http://www.cnblogs.com/fe ...
- 添加thrust的库后出错
在添加thrust库中的host_vector.h等头文件时 C:\NVIDIA\cudatoolkit\include\thrust\detail\config中的debug.h一直出问题,因此注释 ...
- python 获取启动参数
pytho软件编写过程中,会经常使用带参数的启动脚本,这里记载下如何获取输入的参数. 使用sys.argv可获取启动时输入的所有参数,这个是数组,直接使用[]就可以获取,[0]代表的是启动文件时输入的 ...
- 【转】VS项目属性的一些配置项的总结
首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系,假设新建一个项目ssyy,解决方案起名fangan,注意解决方案包括项目, ...
- MysqlDumpslow
可以帮助分析慢查询. 选项: -n 10 列出最近10条慢查询 如: mysqldumpslow
- elipse插件整理
整理一下用过的eclipse插件: 1. WindowBuilder :swing插件,可以拖啊拖啊拖出来一个窗口,可以显著提高开发效率. 官网: http://www.eclipse.org/w ...
- 学习JNDI
既然datasource对象有tomcat提供,那么我们如何在应用程序中获得它呢,tomcat把这个对象放在JNDI服务中, 并用一个名字把它关联起来,我们在应用程序中,只需通过JNDI搜索这个名字, ...
- Gmail 账号找回办法
前段时间一直在用GFW代理,结果发现GOOGLE账户的保护机制起用了,要给以前的手机号发消息,结果哪个号现在不用了,所以就登陆不进去了,非常扯淡,索性谷歌了下,得出如下的解决方案,完美解决,下次直接在 ...
- Delphi字符串与字符数组之间的转换(初始化的重要性)
紧接着上篇博客讲解的内容: 将Char型数组转换为string类型还有下面的这种方法 但是我在测试的时候遇到了一些问题,并在下面进行了解释和总结 先说出我的总结 其实我们在学习编程的时候(比如我之前学 ...