numpy基本的索引和切片

import numpy as np
arr = np.array([1,2,3,555,666,888,10])
arr
array([ 1, 2, 3, 555, 666, 888, 10]) # 数组的切片是不会复制,任何视图上的修改都会直接修改源数组
arr[1:5]
array([ 2, 3, 555, 666]) # 广播 将一个标量赋值给一个切片时,自动传播到整个选区
arr[1:5] = 12
# 源数据改变
arr
array([ 1, 12, 12, 12, 12, 888, 10])

注意:由于Numpy的设计目的是处理大数据,所以如果坚持要讲数据复制来复制去的话会产生严重的性能和内存问题。 警告:如果你想得到的是一份副本而非视图,就需要显示复制操作

arr =
array([ 1, 12, 12, 12, 12, 888, 10]) arr_slice = arr[5:8]
array([888, 10])
arr_slice[1] = 123456
# 源数据改变
arr
array([ 1, 12, 12, 12, 12, 888, 123456]) arr_slice[:] = 64
# 源数据改变
arr
array([ 1, 12, 12, 12, 12, 64, 64])

多维数组的操作

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 索引是一维数组,不再是标量
arr2d[2]
array([7, 8, 9]) arr2d[2,0]
7

Numpy数组中的元素索引

arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d array([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]]]) arr3d[0]
array([[1, 2, 3],
[4, 5, 6]]) # 复制一份副本
old_values = arr3d[0].copy()
old_values
array([[1, 2, 3],
[4, 5, 6]])
# 赋值标量
arr3d[0] = 42
arr3d
# 源数据改变
array([[[42, 42, 42],
[42, 42, 42]], [[ 7, 8, 9],
[10, 11, 12]]]) # 赋值上面的保存的副本
arr3d[0] = old_values
arr3d
# 源数据恢复之前的状态
array([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]]]) arr3d[1,0]
array([7, 8, 9])

注意:上面所有的这些选取数组子集的例子中,返回的数组都是视图

切片索引 跟Python列表这样的一维对象差不多

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) arr2d[:2]
array([[1, 2, 3],
[4, 5, 6]]) arr2d[:2,:1]
array([[1],
[4]]) arr2d[2,:1]
array([7]) arr2d[:,:1]
array([[1],
[4],
[7]]) # 对切片赋值也会被扩散到整个选区
arr2d[:2,1:] = 0
arr2d
array([[1, 0, 0],
[4, 0, 0],
[7, 8, 9]])

布尔型索引

names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
# 随机生成数字
data = np.random.randn(7,4)
names array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4') data
array([[-0.61531969, 0.09937418, -1.15678643, -0.17431226],
[-1.72274669, -0.88961153, -1.21114235, 0.53001087],
[ 0.43352234, 0.32843525, 0.4930513 , -1.78710182],
[ 0.43997916, 0.4744386 , -2.27592661, -0.41136012],
[-0.63605234, -1.31366781, -1.5077842 , -0.98485074],
[-0.62922743, -0.62193719, -0.42214742, 0.94249323],
[ 0.38367682, 0.67807875, 0.32268169, 0.30776196]]) # 假设每个名字都对应data数组中的一行,我们想要选出对应于名字'Bob'的所有行
names == 'Bob'
array([ True, False, False, True, False, False, False]) # 数组的比较运算也是矢量化的
data[names == 'Bob']
array([[-0.61531969, 0.09937418, -1.15678643, -0.17431226],
[ 0.43997916, 0.4744386 , -2.27592661, -0.41136012]]) # 数组的长度必须跟被索引的轴长度一致,此外还可以将布尔型数组跟切片、整数、混合使用
data[names == 'Bob', 2:]
array([[-1.15678643, -0.17431226],
[-2.27592661, -0.41136012]]) data[names == 'Bob', 3]
array([-0.17431226, -0.41136012]) # 要选择'Bob'以外的其他值,既可以使用!=,也可以通过负号(-)对条件进行否定
names != 'Bob'
array([False, True, True, False, True, True, True]) data[names != 'Bob']
array([[-1.72274669, -0.88961153, -1.21114235, 0.53001087],
[ 0.43352234, 0.32843525, 0.4930513 , -1.78710182],
[-0.63605234, -1.31366781, -1.5077842 , -0.98485074],
[-0.62922743, -0.62193719, -0.42214742, 0.94249323],
[ 0.38367682, 0.67807875, 0.32268169, 0.30776196]])

选取这三个名字中的两个需要组合应用于多个布尔条件、使用&(和)、|(或)之类的布尔算数运算符即可

Python关键字and和or在布尔型数组中无效

mask = (names == 'Bob')|(names == 'Will')
mask
array([ True, False, True, True, True, False, False]) data[mask]
array([[-0.61531969, 0.09937418, -1.15678643, -0.17431226],
[ 0.43352234, 0.32843525, 0.4930513 , -1.78710182],
[ 0.43997916, 0.4744386 , -2.27592661, -0.41136012],
[-0.63605234, -1.31366781, -1.5077842 , -0.98485074]])

注意:通过布尔型索引选择数组数据,将总是创建数据的副本,即使返回一模一样的数组也是如此

# 将data中的所有负值都设置为 0
data[data<0] = 0
data
array([[0. , 0.09937418, 0. , 0. ],
[0. , 0. , 0. , 0.53001087],
[0.43352234, 0.32843525, 0.4930513 , 0. ],
[0.43997916, 0.4744386 , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0.94249323],
[0.38367682, 0.67807875, 0.32268169, 0.30776196]]) data[ names != 'Joe'] = 7
data
array([[7. , 7. , 7. , 7. ],
[0. , 0. , 0. , 0.53001087],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[0. , 0. , 0. , 0.94249323],
[0.38367682, 0.67807875, 0.32268169, 0.30776196]])

花式索引

利用整数数组进行索引

arr = np.empty((8,4))
arr
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]) for i in range(8):
arr[i] = i
arr array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
# 以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可
arr[[4,3,0,6]] array([[4., 4., 4., 4.],
[3., 3., 3., 3.],
[0., 0., 0., 0.],
[6., 6., 6., 6.]]) # 使用负数索引
arr[[-3,-5,-7]]
array([[5., 5., 5., 5.],
[3., 3., 3., 3.],
[1., 1., 1., 1.]]) # 一次传入多个索引数组
arr = np.arange(32).reshape((8,4))
arr
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]]) #它返回的是一个一维数组,其中的元素对应各个索引元组
arr[[1,5,7,2],[0,3,1,2]]
array([ 4, 23, 29, 10])
# 选取方形区域的索引器
arr[np.ix_([1,5,7,2],[0,3,1,2])]
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])

注意:花式索引跟切片不一样,它总是将数据复制到新数组中

数组转置和轴对换

  • 转置(transpose方法):重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作)。
  • T属性
arr1 = np.arange(15).reshape((3,5))
arr1 # 三行五列
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr1.T # 转置为五行三列 适用于二维数组
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
# 在进行矩阵计算时,经常需要用到该操作,内积计算,行行向量乘以列向量
np.dot(arr1.T,arr1)
array([[125, 140, 155, 170, 185],
[140, 158, 176, 194, 212],
[155, 176, 197, 218, 239],
[170, 194, 218, 242, 266],
[185, 212, 239, 266, 293]])

  • 计算方法:计算第几行第几列的数字,就把arr1.T的行取出来 和 arr1的列去乘,例如:

    • 125位于第一行第一列,则计算过程 0 * 0 + 5 * 5 + 10 * 10 = 125
    • 197位于第三行第三列,则计算过程 2 * 2 + 7 * 7 + 12 * 12 = 197
    • 218位于第四行第三列,则计算过程 3 * 2 + 8 * 7 + 13 * 12 = 218

Numpy:索引与切片的更多相关文章

  1. Numpy 索引及切片

    1.一维数组的索引及切片 ar = np.arange(20) print(ar) print(ar[4]) print(ar[3:6]) print(ar[:4:2]) #索引到4 按2的步长 pr ...

  2. numpy 索引和切片

    一.取行 1.单行 数组[index, :] # 取第index+1行 例子 import numpy as np arr1 = np.arange(0, 24).reshape(4, 6) # 取第 ...

  3. numpy之索引和切片

    索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制 ...

  4. Numpy系列(四)- 索引和切片

    Python 中原生的数组就支持使用方括号([])进行索引和切片操作,Numpy 自然不会放过这个强大的特性.  单个元素索引 1-D数组的单元素索引是人们期望的.它的工作原理与其他标准Python序 ...

  5. NumPy学习(索引和切片,合并,分割,copy与deep copy)

    NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程 ...

  6. NumPy 学习 第二篇:索引和切片

    数组索引是指使用中括号 [] 来定位数据元素,不仅可以定位到单个元素,也可以定位到多个元素.索引基于0,并接受从数组末尾开始索引的负索引. 举个例子,正向索引从0开始,从数组开始向末尾依次加1递增:负 ...

  7. numpy数组的索引和切片

    numpy数组的索引和切片 基本切片操作 >>> import numpy as np >>> arr=np.arange(10) >>> arr ...

  8. Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

    一:数组的属性 每个数组都有它的属性,可分为:ndim(数组的维度),shape(数组每个维度的大小),size(数组的总大小),dtype(数组数据的类型) 二:数组索引 和python列表一样,N ...

  9. Numpy学习二:数组的索引与切片

    1.一维数组索引与切片#创建一维数组arr1d = np.arange(10)print(arr1d) 结果:[0 1 2 3 4 5 6 7 8 9] #数组的索引从0开始,通过索引获取第三个元素a ...

随机推荐

  1. 又见 tomcat启动startup.bat一闪而过

    startup.bat启动的时候,一闪而过,停止, 没有提示信息,错误信息,没有任何log... 后面在 startup.bat. catalina.bat 最后 加入 pause. 也看不到结果.. ...

  2. Dubbo 暴露服务

    1. 引入dubbo依赖 dubbo 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId&g ...

  3. PHP 使用非对称加密算法(RSA)

    解释: 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私有密 ...

  4. hIve—timestamp时间戳问题

    先查看表 timestamp可以转换为标准的时间(精确到秒);https://tool.lu/timestamp/ 这个时间格式用处很多: 多个时间可以使用函数,来切换. 每个用户 产生行为的时候,用 ...

  5. DOM节点的增删改查以及class属性的操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 尚硅谷redis学习10-复制

    是什么? 能干嘛? 怎么玩? 1) 初始情况 设置slave 日志查看 主机查看 备机日志 复制状态 觉见问题 1 切入点问题?slave1.slave2是从头开始复制还是从切入点开始复制?比如从k4 ...

  7. Think you can pronounce these 10 words correctly? You might be

    Think you can pronounce these 10 words correctly?  You might be surprised! Share Tweet Share Tagged ...

  8. Python开发环境搭建指导

    本文主要介绍Python开发环境的搭建.主要包括如下几部分内容: (1)Python软件的安装.注意版本的选择和安装过程中选项的勾选. (2)pip工具环境变量.镜像源的配置使用和常用镜像源介绍.pi ...

  9. Django添加ckeditor富文本编辑器

    源码 https://github.com/django-ckeditor/django-ckeditor 通过pip安装. pip3 install django-ckeditor pip3 ins ...

  10. 关于C# WinForm中进度条的实现方法

    http://www.cnblogs.com/Sue_/articles/2024932.html 进度条是一个软件人性化考虑之一,他给用户的感觉就是程序内部在不停的动作,执行到了什么程度,而不是整个 ...