第一章 numpy入门

目录

  • 1.1 numpy数据类型
  • 1.2 numpy数组基础
    • 1.2.1 数组的属性
    • 1.2.2 数组的索引:获取单个元素
    • 1.2.3 数组切片:获取子数组
    • 1.2.4 数组的变形
    • 1.2.5 数组的拼接和分裂

===

1.1 numpy数据类型

1.2 numpy数组基础

1.2.1 数组的属性

import numpy as np
np.random.seed(0)

x1 = np.random.randint(10,size=6)
x2 = np.random.randint(10,size=(3,4))
x3 = np.random.randint(10,size=(3,4,5))

print("x3 ndim:",x3.ndim)
print("x3 shape:",x3.shape)
print("x3 size:",x3.size)
print("x3 dtype:",x3.dtype)
print("x3 itemsize:",x3.itemsize,"bytes")
print("x3 nbytes:",x3.nbytes,"bytes")
x3 ndim: 3
x3 shape: (3, 4, 5)
x3 size: 60
x3 dtype: int32
x3 itemsize: 4 bytes
x3 nbytes: 240 bytes

1.2.2 数组的索引:获取单个元素

1.正向索引取值

print(x1)
print(x1[0])
print(x1[5])
[5 0 3 3 7 9]
5
9

2.反向索引取值

print(x1[-1])
print(x1[-3])
9
3

3.多维数组索引取值

print(x2)
print(x2[1,2])
print(x2[2,1])
print(x2[-1,-2])
[[3 5 2 4]
 [7 6 8 8]
 [1 6 7 7]]
8
6
7

4.索引修改值

x2[0,0] = 23
print(x2)
[[23  5  2  4]
 [ 7  6  8  8]
 [ 1  6  7  7]]

1.2.3 数组切片:获取子数组

1.一维子数组

# 切片格式:
#    x[start:stop:step]
x = np.arange(10)
print("原数组:\n",x)
print("前5个元素:\n",x[:5])
print("索引5之后元素:\n",x[5:])
print("中间的子数组:\n",x[4:7])
print("每隔一个元素:\n",x[::2])
print("每隔一个元素,从索引1开始:\n",x[1::2])
print("所有元素,逆序:\n",x[::-1])
print("从索引4开始每隔一个元素逆序:\n",x[4::-2])
原数组:
 [0 1 2 3 4 5 6 7 8 9]
前5个元素:
 [0 1 2 3 4]
索引5之后元素:
 [5 6 7 8 9]
中间的子数组:
 [4 5 6]
每隔一个元素:
 [0 2 4 6 8]
每隔一个元素,从索引1开始:
 [1 3 5 7 9]
所有元素,逆序:
 [9 8 7 6 5 4 3 2 1 0]
从索引4开始每隔一个元素逆序:
 [4 2 0]

2.多维子数组

print("原数组:\n",x2)
print("两行三列:\n",x2[:2,:3])
print("所有行,每隔一列:\n",x2[:,::2])
print("行逆序:\n",x2[:,::-1])
print("列逆序:\n",x2[::-1,:])
print("行列逆序:\n",x2[::-1,::-1])
原数组:
 [[23  5  2  4]
 [ 7  6  8  8]
 [ 1  6  7  7]]
两行三列:
 [[23  5  2]
 [ 7  6  8]]
所有行,每隔一列:
 [[23  2]
 [ 7  8]
 [ 1  7]]
行逆序:
 [[ 4  2  5 23]
 [ 8  8  6  7]
 [ 7  7  6  1]]
列逆序:
 [[ 1  6  7  7]
 [ 7  6  8  8]
 [23  5  2  4]]
行列逆序:
 [[ 7  7  6  1]
 [ 8  8  6  7]
 [ 4  2  5 23]]

3.获取数组的行和列

print("原数组:\n",x2)
print("获取指定行:\n",x2[2,:])
print("获取指定列:\n",x2[:,1])
print("获取行时,可以省略空的切片:\n",x2[0]) # 等价于 x2[0,:]
原数组:
 [[23  5  2  4]
 [ 7  6  8  8]
 [ 1  6  7  7]]
获取指定行:
 [1 6 7 7]
获取指定列:
 [5 6 6]
获取行时,可以省略空的切片:
 [23  5  2  4]

4.数组的视图(即切片)

print("原数组:\n",x2)
sub_arr = x2[:2,:2]
print("抽取2×2的子数组:\n",sub_arr)
sub_arr[0,0] = 88
print("修改后的子数组:\n",sub_arr)
print("原数组:\n",x2)
# 数组的视图修改值会修改数组本身,它意味着在处理非常大的数据集时,可以获取或处理这些数据集的片段,而不用复制底层的数据缓存。
原数组:
 [[88  5  2  4]
 [ 7  6  8  8]
 [ 1  6  7  7]]
抽取2×2的子数组:
 [[88  5]
 [ 7  6]]
修改后的子数组:
 [[88  5]
 [ 7  6]]
原数组:
 [[88  5  2  4]
 [ 7  6  8  8]
 [ 1  6  7  7]]

5.数组的副本(即复制)

print("原数组;\n",x2)
sub_arr_copy = x2[:2,:2].copy()
print("拷贝2×2的子数组:\n",sub_arr_copy)
sub_arr_copy[0,0] = 100
print("修改后的子数组:\n",sub_arr_copy)
print("原数组;\n",x2)
原数组;
 [[88  5  2  4]
 [ 7  6  8  8]
 [ 1  6  7  7]]
拷贝2×2的子数组:
 [[88  5]
 [ 7  6]]
修改后的子数组:
 [[100   5]
 [  7   6]]
原数组;
 [[88  5  2  4]
 [ 7  6  8  8]
 [ 1  6  7  7]]

1.2.4 数组的变形

# 数组的变形最灵活的方式是通过reshape() 函数来实现。
grid = np.arange(1,10).reshape(3,3)
print("将数字1-9放入一个3×3的矩阵中:\n",grid)

# 请注意,如果该方法可行,那么原数组的大小必须和变形后的数组大小一致。如果满足这个条件,
# reshape方法将会用到原数组的一个非副本视图。但实际情况是,在非连续的数据缓存的情况下,
# 返回非副本视图往往不可能实现。

# 另一种常见的变形模式时将一个一维数组变形为二维数组的行或列的矩阵。你也可以通过reshape
# 方法来实现,或者更简单的通过在一个切片操作中利用newaxis关键字:
x = np.array([1,2,3])
print("原数组:\n",x)
print("通过变形获得行向量:\n",x.reshape(1,3))
print("通过newaxis获取行向量:\n",x[np.newaxis,:])
print("通过变形获取列向量:\n",x.reshape((3,1)))
print("通过newaxis获取列向量:\n",x[:,np.newaxis])
将数字1-9放入一个3×3的矩阵中:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
原数组:
 [1 2 3]
通过变形获得行向量:
 [[1 2 3]]
通过newaxis获取行向量:
 [[1 2 3]]
通过变形获取列向量:
 [[1]
 [2]
 [3]]
通过newaxis获取列向量:
 [[1]
 [2]
 [3]]

1.2.5 数组的拼接和分裂

1.数组的拼接

# 拼接numpy数组主要由 np.concatenate、np.vstack和np.hstack函数实现。
x = np.array([1,2,3])
y = np.array((7,6,15))
z = np.array([43,3,53])
arr_2n = np.array([[1,2,3],
                   [4,5,6],
                   [7,8,9]])
# 一维数组的拼接
print("拼接x和y数组:\n",np.concatenate([x,y])) # concatenate传入元祖
print("拼接x和y和z数组:\n",np.concatenate((x,x,z))) # concatenate传入列表
# 二维数组的拼接
print("沿第一个轴拼接:\n",np.concatenate([arr_2n,arr_2n]))
print("沿第二个轴拼接:\n",np.concatenate((arr_2n,arr_2n),axis=1))
# 沿着固定维度处理数据时,使用np.vstack(垂直栈)和np.hstack(水平栈)函数会更简洁:
print("垂直栈数组:\n",np.vstack([x,arr_2n]))
print("水平栈数组:\n",np.hstack([arr_2n,x[:,np.newaxis]]))
拼接x和y数组:
 [ 1  2  3  7  6 15]
拼接x和y和z数组:
 [ 1  2  3  1  2  3 43  3 53]
沿第一个轴拼接:
 [[1 2 3]
 [4 5 6]
 [7 8 9]
 [1 2 3]
 [4 5 6]
 [7 8 9]]
沿第二个轴拼接:
 [[1 2 3 1 2 3]
 [4 5 6 4 5 6]
 [7 8 9 7 8 9]]
垂直栈数组:
 [[1 2 3]
 [1 2 3]
 [4 5 6]
 [7 8 9]]
水平栈数组:
 [[1 2 3 1]
 [4 5 6 2]
 [7 8 9 3]]

2.数组的分裂

# 分裂numpy数组主要由 np.split、np.vsplit和np.hsplit函数实现。
# 可以向以上函数传传入一个索引列表作为参数,索引列表记录的是分裂点的位置:
split_date = np.array([2,3,5,1,3,5,6,34,43,23,1])
grid = np.arange(16).reshape(4,4)
print("原数组split_date:\n",split_date,"\n原数组grid:\n",grid)
x1,x2,x3 = np.split(split_date,[3,5])
print("分裂后的数组:\n",x1,x2,x3)
upper,lower = np.vsplit(grid,[2])
print("垂直分裂upper:\n",upper,"\n垂直分裂lower:\n",lower)
left,right = np.hsplit(grid,[2])
print("水平分裂left:\n",left,"\n水平分裂right:\n",right)
原数组split_date:
 [ 2  3  5  1  3  5  6 34 43 23  1]
原数组grid:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
分裂后的数组:
 [2 3 5] [1 3] [ 5  6 34 43 23  1]
垂直分裂upper:
 [[0 1 2 3]
 [4 5 6 7]]
垂直分裂lower:
 [[ 8  9 10 11]
 [12 13 14 15]]
水平分裂left:
 [[ 0  1]
 [ 4  5]
 [ 8  9]
 [12 13]]
水平分裂right:
 [[ 2  3]
 [ 6  7]
 [10 11]
 [14 15]]

本文地址:https://www.cnblogs.com/-xiaoyu-/p/12293645.html

原文地址:https://www.cnblogs.com/-xiaoyu-/p/12293645.html

时间: 2024-11-08 23:47:50

第一章 numpy入门的相关文章

第一章 快速入门

C++ Primer 中文版,第4版 /* 第一章 快速入门第二章 变量和基本类型第三章 标准库类型第四章 数组和指针第五章 表达式第六章 语句第七章 函数第八章 标准IO库第九章 顺序容器第十章 关联容器第11章 泛型算法 第12章 类 第13章 复制控制 第14章 重载操作符与转换第15章 面向对象编程第16章 模板和泛型编程第17章 用于大型程序的工具第18章 特殊工具与技术 */ /* 第一部分:基本语言------------------------------------------

jquery基础教程 - 第一章 JQUERY入门

Jquery基础教程 - 第一章 JQUERY入门 内容提要 1.jquery能做什么 2.jquery为什么如此出色 3.第一个jquery驱动的页面 4.纯javascript与jquery 5.开发工具 6.小结 1.jquery能做什么 取得文档中的元素 -- jQuery为准确的获得需要检查或操纵的文档元素,提供了可靠而富有效率的选择符机制. 找到所有应用了.content class样式的div中所有的P标签             $('div.content').find('p'

第一章 Qt入门

现在自己开始学习Qt了,参考资料是C++ GUI Qt4编程 准备做一系列的学习笔记,也算帮助自己学习吧,希望自己能坚持下去. 1.先来一段程序代码,当然是鼎鼎大名的Hello Qt 1 #include <QApplication> 2 #include <QLabel> 3 4 int main(int argc, char** argv) 5 { 6 QApplication app(argc, argv); 7 //QLabel *label = new QLabel(&q

Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门

本章将涵盖以下话题: ž  MyBatis是什么? ž  为什么选择MyBatis? ž  MyBatis安装配置 ž  域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Java数据持久化层(persistencelayer)的开源框架,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互. MyBatis的前身是iBATIS,iBATIS于2002年由ClintonBegin创建.MyBatis 3 是iBATIS的全新设计,支持注解和Mapper

zabbix专题:第一章 zabbix入门简介(更新中)

zabbix入门简介 备注:本章节图片来自互联网 对Linux有兴趣的朋友加入QQ群:476794643 在线交流 本节目录大纲 zabbix专题:第一章 zabbix简介 我们为什么需要监控? 常用的开源监控系统有哪些? Zabbix是什么? Zabbix的功能和特性 Zabbix的架构 Zabbix的工作流程 zabbix的进程 zabbix的逻辑关系图 zabbix监控环境中相关术语 zabbix的流程图,其串联了各术语之间的关系 zabbix的监控架构 zabbix专题:第一章 zabb

java基础 第一章 对象入门

第1章 对象入门 "为什么面向对象的编程会在软件开发领域造成如此震憾的影响?" 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显得如此高雅和浅显.此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务.每个人都可从中获益,至少表面如此. 如果说它有缺点,那就是掌握它需付出的代价.思考对象的时候,需要采用形象思维,而不是程序化的思维.与程序化设

第一章 Python入门

第1章 编程与编程语言 1.1 什么是编程 从字面上理解,编程就是"编写程序".那么: 谁来编写?-程序员. 怎么编写?-根据需求,使用某种编程语言来编写. 什么是程序?-程序是指放在磁盘里的静态数据,可以是代码.文件等. 编程:程序员根据需求,使用某种编程语言来编写出的代码. 程序在未运行之前,就是放在磁盘中的静态数据.普通文件,只有在程序运行的时候,程序里面的字符内容对应编程语言的语法,才能让计算机理解并去工作执行,这样才有意义. 1.2 什么是编程语言 编程语言:计算机能够读懂理

C++primer第一章 快速入门

本章介绍 C++ 的大部分基本要素:内置类型.库类型.类类型.变量.表达式.语句和函数. 在这一过程中还会简要说明如何编译和运行程序. 要学会一门新的程序语言,必须实际动手编写程序.在这一章,我们将缩写程序解决一个简单的数据处理问题:某书店以文件形式保存其每一笔交易.每一笔交易记录某本书的销售情况,含有 ISBN(国际标准书号,世界上每种图书的唯一标识符).销售册数和销售单价.每一笔交易形如: 0-201-70353-X 4 24.99 在编写这个程序之前,必须知道 C++ 的一些基本特征.至少

《Python数据科学手册》第二章 Numpy入门2.1—2.3

 2.1 理解Python中的数据类型 Python的用户被其易用性所吸引,其中一个易用之处就在于动态输入,即在Python中,类型是动态推断的.这意味着可以将任何类型的数据指定给任何变量.但是这种类型灵活性也指出了一个事实: Python 变量不仅是它们的值,还包括了关于值的类型的一些额外信息 . C语言整型本质上是对应某个内存位置的标签,里面存储的字节会编码成整型.而Python的整型其实是一个指针,只向包含这个Python对象所有信息的某个内存位置,其中包括可以转换成整型的字节.Pytho