NumPy 数组操作:

  1、修改数组形状

    a、numpy.reshape(arr, newshape, order='C') 在不改变数据的条件下修改形状

    b、numpy.ndarray.flat 是一个数组元素迭代器

    c、numpy.ndarray.flatten(self, order) 返回一份数组拷贝,对拷贝数组修改不会影响原数组

    d、numpy.ravel(a, order='C') 展开数组元素,顺序通常是 "C 风格",返回的是数组视图,即修改会影响原始数组

import numpy as np

# 将 1 维数组改变为形状为 2*5 的数组
arr = np.arange(10).reshape(2, 5)
print("arr: ", arr) for elem in arr.flat:
elem = elem + 1
print(elem, end=" ") # 1 2...10
# 原数组未改变!!!
print("\narr: ", arr) arr.shape = (5, 2)
# [0 1 2 3 4 5 6 7 8 9]
print("Order is C: ", arr.flatten())
# [0 2 4 6 8 1 3 5 7 9]
print("Order is F: ", arr.flatten(order="F")) temp = arr.ravel()
print("arr: ", temp)
# 修改了展开数组下标为 2 的元素
arr.ravel()[2] = 10
print("arr: ", arr) # arr 发生改变

  2、翻转数组

    a、numpy.transpose(arr, axes) 用于对换数组的维度

    b、numpy.ndarray.T 类似 numpy.transpose()

    c、numpy.rollaxis(arr, axis, start) 向后滚动特定的轴到一个特定位置

    d、numpy.swapaxes(arr, axis1, axis2) 用于交换数组的两个轴

import numpy as np

# numpy.transpose(arr, axes) 用于对换数组的维度
arr = np.arange(1, 11).reshape(5, 2)
print("transpose arr: ", np.transpose(arr))
# numpy.ndarray.T 类似 numpy.transpose()
print("arr.T: ", arr.T) # numpy.rollaxis(arr, axis, start) 向后滚动特定的轴到一个特定位置
arr = np.arange(4).reshape(2, 2)
print("rollaxis arr: ", np.rollaxis(arr, axis=1)) # [[0 2] [1 3]]
# numpy.swapaxes(arr, axis1, axis2) 用于交换数组的两个轴
print("swapaxes arr: ", np.swapaxes(arr, 1, 0)) # [[0 2] [1 3]]

  3、修改数组维度

    a、numpy.broadcast 用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果

    b、numpy.broadcast_to(array, shape, subok=False) 函数将数组广播到新形状。它在原始数组上返回只读视图,通常不连续。 如果新形状不符合 NumPy 的广播规则,该函数可能会抛出ValueError

    c、numpy.expand_dims(arr, axis) 通过在指定位置插入新的轴来扩展数组形状

    d、numpy.squeeze(arr, axis) 从给定数组的形状中删除一维的条目

import numpy as np

# numpy.broadcast 用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])
# 它拥有 iterator 属性,基于自身组件的迭代器元组
# 发生广播,[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
b = np.broadcast(x, y)
c = np.empty(b.shape) # 生成形状如 b 的随机数组 print(c.shape)
print('手动使用 broadcast 将 x 与 y 相加:')
c.flat = [u + v for (u, v) in b]
print("x+y: ", c)
# 若把下面 b 的代码注释掉时输出空列表,以为迭代器指向末尾
b = np.broadcast(x, y)
lst = [o for o in b]
print("lst: ", lst) # numpy.broadcast_to(array, shape, subok) 将数组广播到新形状。它在原始数组上返回只读视图,通常不连续
a = np.array([[1], [2], [3]])
b = np.broadcast_to(a, (3, 2)) # [[1 1] [2 2] [3 3]]
print("b: ", b) # numpy.expand_dims(arr, axis) 通过在指定位置插入新的轴来扩展数组形状
a = np.array([[1, 2], [3, 4]])
print("shape of a: ", a.shape) # (2, 2)
# 可以将 axis 看成数组形状元组的下标,在对应下标插入新轴
b = np.expand_dims(a, axis=0)
print("b: ", b) # [[[1 2] [3 4]]]
print("shape of b: ", b.shape) # (1, 2, 2) b = np.expand_dims(a, axis=1)
print("b: ", b) # [[[1 2]] [[3 4]]]
print("shape of b: ", b.shape) # (2, 1, 2) # numpy.squeeze(arr, axis) 从给定数组的形状中删除一维的条目
x = np.arange(9).reshape(1, 3, 3)
print("x: ", x)
print("shape of x: ", x.shape) # (1, 3, 3)
# 注意是一维的条目,若在这里 axis=1 则会报错,以为 axis=1 轴不为 1
y = np.squeeze(x, axis=0)
print("y: ", y)
print("shape of y: ", y.shape) # (3, 3)

  4、连接数组

    a、numpy.concatenate((a1, a2, ...), axis用于沿指定轴连接相同形状的两个或多个数组

    b、numpy.stack(arrays, axis=0, out=None用于沿新轴连接数组序列

    c、numpy.hstack((a1, a2, ...)) 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组

    d、numpy.vstack((a1, a2, ...)) 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组

import numpy as np

# numpy.concatenate((a1, a2, ...), axis) 用于沿指定轴连接相同形状的两个或多个数组
a = np.array([[1, 2], [5, 6]])
b = np.array([[3, 4], [7, 8]])
# [[1 2 3 4] [5 6 7 8]]
print("使用 1 轴连接 2 个数组: ", np.concatenate((a, b), axis=1)) # numpy.stack(arrays, axis) 用于沿新轴连接数组序列,arrays相同形状的数组序列
# [[1 2] [5 6] [3 4] [7 8]]
print("使用 0 轴堆叠 2 个数组: ", np.concatenate((a, b), axis=0)) # numpy.hstack((a1, a2, ...)) 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组
# [[1 2 3 4] [5 6 7 8]]
print("水平堆叠: ", np.hstack((a, b))) # numpy.vstack((a1, a2, ...)) 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组
# [[1 2] [5 6] [3 4] [7 8]]
print("垂直堆叠: ", np.vstack((a, b)))

  5、分割数组

    a、numpy.split(ary, indices_or_sections, axis沿特定的轴将数组分割为子数组

    b、numpy.hsplit(ary, indices_or_sections) 用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组

    c、numpy.vsplit(ary, indices_or_sections) 用于垂直分割数组,其分割方式与hsplit用法相同

import numpy as np

# numpy.split(ary, indices_or_sections, axis) 沿特定的轴将数组分割为子数组
# indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
arr = np.linspace(1, 100, 10)
print("每个子数组长度为 2 分割:", np.split(arr, 5))
# 分割成 arr[0...2) arr[2...4) arr[4...7) arr[7...-1]
print("按特定下标分割:", np.split(arr, [2, 4, 7])) # numpy.hsplit(ary, indices_or_sections) 函数用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组
arr = arr.reshape(2, 5)
print("After reshape arr: ", arr)
print("hsplit the arr: ", np.hsplit(arr, 5)) # numpy.vsplit(ary, indices_or_sections) 沿着垂直轴分割,其分割方式与 hsplit 用法相同
print("vsplit the arr: ", np.vsplit(arr, 2))

  6、数组元素的添加与删除

    a、numpy.resize(arr, shape) 返回指定大小的新数组;若新数组大小大于原始大小,则包含原始数组中的元素的副本

    b、numpy.append(arr, values, axis=None) 在数组的末尾添加值

    c、numpy.insert(arr, obj, values, axis=None在给定索引之前,沿给定轴在输入数组中插入值,obj 为索引

    d、numpy.delete(arr, obj, axis) 返回从输入数组中删除指定子数组的新数组,obj 为索引

    e、numpy.unique(arr, return_index, return_inverse, return_counts用于去除数组中的重复元素

import numpy as np

# numpy.resize(arr, shape) 返回指定大小的新数组;若新数组大小大于原始大小,则包含原始数组中的元素的副本
arr = np.sin(np.array([0, 30, 45, 60, 90, 120, 135, 150, 180]).reshape(3, 3) * np.pi/180)
np.set_printoptions(precision=1) # 保留小数点后一位
print("resize(arr, (1, 9)): ", np.resize(arr, (1, 9)))
# 大小大于原始大小,将数组的头 3 个的副本保存到最后一行
print("resize(arr, (4, 3)): ", np.resize(arr, (4, 3)))
# 保存数组第一个元素的副本到末尾
print("resize(arr, (2, 5)): ", np.resize(arr, (2, 5)))
np.set_printoptions(precision=8) # 默认为 8 # numpy.append(arr, values, axis=None) 在数组的末尾添加值
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 当axis无定义时,是横向加成,返回总是为一维数组
# [1 2 3 4 5 6 7 8 9]
print("append(arr, [7, 8, 9]): ", np.append(arr, [7, 8, 9]))
# 按 0 轴加成,列数要相同,还有就是追加的是二维数组
# [[1 2 3] [4 5 6] [7 8 9]]
print("append(arr, [7, 8, 9], axis=0): ", np.append(arr, [[7, 8, 9]], axis=0))
# 注意行数要相同,[[1 2 3 4 5 6] [4 5 6 7 8 9]]
print("append(arr, [[4, 5, 6], [7, 8, 9]], axis=1): ", np.append(arr, [[4, 5, 6], [7, 8, 9]], axis=1)) # numpy.insert(arr, obj, values, axis) 在给定索引之前,沿给定轴在输入数组中插入值
arr = np.array([1, 2, 3, 4, 5, 6]).reshape(3, 2)
# 如果未提供轴,则输入数组会被展开
print("insert(arr, 3, [6, 6, 6]): ", np.insert(arr, 3, [6, 6, 6]))
print("insert(arr, 3, [7, 8], axis=0): ", np.insert(arr, 3, [7, 8], axis=0))
# 若形状不匹配,还会试图广播数组
print("insert(arr, 1, [6], axis=1): ", np.insert(arr, 1, [6], axis=1)) # numpy.delete(arr, obj, axis) 返回从输入数组中删除指定子数组的新数组
# 如果未提供轴,则输入数组会被展开
print("delete(arr, 2): ", np.delete(arr, 2))
# 分别按 0 轴和 1 轴删除下标为 1 的元素
print("delete(arr, 1, axis=0): ", np.delete(arr, 1, axis=0))
print("delete(arr, 1, axis=1): ", np.delete(arr, 1, axis=1)) # numpy.unique(arr, return_index, return_inverse, return_counts) 用于去除数组中的重复元素
arr = np.array([5, 3, 4, 2, 2, 1, 9, 0, 3, 4])
print("unique(arr): ", np.unique(arr))
# 若 return_index=True 则返回新元素在旧数组中(第一个符合的元素)的下标
print("unique(arr, return_index=True): ", np.unique(arr, return_index=True))
# 若 return_inverse=True 则返回旧数组元素在新数组中的下标
print("unique(arr, return_inverse=True): ", np.unique(arr, return_inverse=True))
# 若 return_counts=True 则返回对应元素在原数组中出现的次数
print("unique(arr, return_counts=True): ", np.unique(arr, return_counts=True))

NumPy 学习笔记(三)的更多相关文章

  1. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  2. NumPy学习笔记 一

    NumPy学习笔记 一 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  3. numpy 学习笔记

    numpy 学习笔记 导入 numpy 包 import numpy as np 声明 ndarray 的几种方法 方法一,从list中创建 l = [[1,2,3], [4,5,6], [7,8,9 ...

  4. Numpy学习笔记(下篇)

    目录 Numpy学习笔记(下篇) 一.Numpy数组的合并与分割操作 1.合并操作 2.分割操作 二.Numpy中的矩阵运算 1.Universal Function 2.矩阵运算 3.向量和矩阵运算 ...

  5. Numpy学习笔记(上篇)

    目录 Numpy学习笔记(上篇) 一.Jupyter Notebook的基本使用 二.Jpuyter Notebook的魔法命令 1.%run 2.%timeit & %%timeit 3.% ...

  6. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  7. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  8. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  9. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  10. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

随机推荐

  1. python Request模块

    ---恢复内容开始--- Request的五种请求方式: request.get() request.post() request.head() requst.put() request.patch( ...

  2. 路漫漫其修远兮,吾将上下而求索--2019OKR规划

    一.前言 加入博客园半年多,认识了很多优秀上进,乐于分享的人,我的男神:EdisonZhou,还有张队长,叶伟民,腾飞,梁桐铭 等等. 半年来写了26篇随笔,我的第一篇随笔 C# DynamicObj ...

  3. kafka可视化客户端工具(Kafka Tool)的基本使用(转)

    转载地址:https://www.cnblogs.com/frankdeng/p/9452982.html 1.下载 下载地址:http://www.kafkatool.com/download.ht ...

  4. 局域网IP地址

    A类: 10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址). 127.X.X.X是保留地址,用做循环测试用的. B类: 172.16.0.0---172.31.255 ...

  5. .NET英文技术文章导读(2017-03-23)

    关键字:VS2017.扩展.Service Fabric.Unit Test.ELMAH Web开发人员必装的5个VS2017扩展 作者:Jeffrey T. Fritz 链接:https://blo ...

  6. URL包里的URL.getpath()对路径中空格识别为%20的处理办法

    方法(1),使用repaceAll("%20",' ')替换后,只能解决空格问题.但是路径中包含%和中文就不行了. 方法(2),使用URLDecoder.decode(str,&q ...

  7. Anki 2.0 用户手册

    Anki 2.0 用户手册 目录 Anki 2.0 用户手册 视频介绍 卡片和模板 Javascript Anki 2.0 用户手册 视频介绍 共享牌组和基础复习技巧 调换卡片正反面 卡片样式设计 亲 ...

  8. day26.面向对象-反射封装内置方法

    封装 隐藏对象的属性和实现细节,近对外提供公共访问方式 广义:代码保护,面向对象思想 狭义:将属性,方法隐藏起来 class Person: __key = 123456 # 私有的静态属性 def ...

  9. 今天分享三种方法实现Linux系统调用,感兴趣的朋友可以参考一下

    系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系 ...

  10. Exp1 PC平台逆向破解 20165235 祁瑛

    Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...