numpy的基本API(二)——维数操作
numpy的基本维数操作API
iwehdio的博客园:https://www.cnblogs.com/iwehdio/
1、np.copyto(dst, src) copyto方法将数组src复制到dst中。如果两个数组的形状完全相同,则复制后两数组中的数据相同。如果src的维数n比dst的维数低,且与dst中的最后几个维度shape[:-n]相同,就将dst中每个形状与src相同的都复制为src。
>>> a = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]) # (2,2,3)
>>> b = np.array([[7,8,9],[10,11,12]]) # (2,3)
>>> c = np.array([10]) #(1,)
>>> np.copyto(a,b)
>>> a
array([[[ 7, 8, 9],
[10, 11, 12]],
[[ 7, 8, 9],
[10, 11, 12]]])
>>> np.copyto(a,c)
>>> a
array([[[10, 10, 10],
[10, 10, 10]],
[[10, 10, 10],
[10, 10, 10]]])
2、np.reshape(a, shape) reshape方法将数组a在不改变数据的情况下改变形状。a表示目标数组,shape表示所要改变为的形状,可以为元组如(2,3),也可为列表如[2,3]。shape中某一维度的值为-1表示此维度的数据长度为自适应。但是shape改变的新数组大小必须与原数组相同。返回值为numpy数组。同时,可以使用a.reshape(shape),此时shape除了可为元组和列表外,也可以之间为用逗号间隔的数字2,3。
>>> a = np.arange(6)
>>> a
array([0, 1, 2, 3, 4, 5])
>>> np.reshape(a,(2, 3))
array([[0, 1, 2],
[3, 4, 5]])
>>> np.reshape(a,(3,-1))
array([[0, 1],
[2, 3],
[4, 5]])
>>> a.reshape(6,1)
array([[0],
[1],
[2],
[3],
[4],
[5]])
3、np.ravel(a) raevl方法将数组a展平为一维数组,shape为(n, ),a为输入数组。同样的,也可以使用a.ravel(),注意不要丢掉括号。
>>> np.ravel(a)
array([0, 1, 2, 3, 4, 5])
>>> np.array([[4,5,6],[1,2,3]]).ravel()
array([4, 5, 6, 1, 2, 3])
4、a.flat[n] flat方法将数组a按一维数组索引,如数据a的shape为(M, N),则索引n可取[0, M*N-1]。也可以取一个列表作为索引如a.flat[[q, w]],返回索引为q和w的数组。同时,还有a.flat=x可以把数组a中的所有值改为x,也可a.flat[[q,w]=x]对列表中的特定之进行改变。
>>> a = np.arange(1, 7).reshape(2, 3)
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> a.flat[5]
6
>>> a.flat[[2,4]]
array([3, 5])
>>> a.flat = 3
>>> a
array([[3, 3, 3],
[3, 3, 3]])
>>> a.flat[[1,5]]=5
>>> a
array([[1, 5, 3],
[4, 5, 5]])
5、np.moveaxis(a, src, dst) moveaxis方法将数组的轴进行移动。src表示所要移动的轴的索引,dst表示所要移动到的位置,都可以为列表对象进行对应移动。
需要注意的是,移动轴的含义是,把原来src索引位置的轴改为dst索引位置,而不是进行索引位置的交换。如shape为(2,3,4)的数组a经过b=np.moveaxis(a, 0, -1)后,b的shape为(3,4,2),也就是说其他轴按原来的顺序向前填充了,等价于np.moveaxis(x, [0, 1, 2], [-1, -3, -2])。此外,在索引更改后的数组与原数组对应的位置进行切片,切片的shape也有可能会与原数组不同而为其转置的shape。
>>> x = np.arange(0, 24).reshape(2, 3, 4)
>>> x
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]]])
>>> y=np.moveaxis(x, 0, -1)
>>> y
array([[[ 0, 12],
[ 1, 13],
[ 2, 14],
[ 3, 15]], [[ 4, 16],
[ 5, 17],
[ 6, 18],
[ 7, 19]], [[ 8, 20],
[ 9, 21],
[10, 22],
[11, 23]]])
>>> y.shape
(3, 4, 2)
>>> np.moveaxis(x, [0, 1, 2], [-1, -3, -2]).shape
(3, 4, 2)
>>> y[0,:,:]
array([[ 0, 12],
[ 1, 13],
[ 2, 14],
[ 3, 15]])
>>> x[:,0,:]
array([[ 0, 1, 2, 3],
[12, 13, 14, 15]])
可以看到,x和y都在shape为3的轴求该轴索引为0时的切片,得到的数组互为转置。但是对所进行moveaxis操作的shape为2的轴,按其轴索引进行切片,得到的数组与原数组相同。
moveaxis方法当只对一个轴进行操作时,也可由rollaxis方法实现,但是更推荐前者。
6、np.swapaxes(a, axis1, axis2) swapaxes方法对数组a中的两个轴的位置进行互换,其他轴的位置不变。
>>> x = np.arange(0, 24).reshape(2, 3, 4)
>>> x.shape
(2, 3, 4)
>>> y = np.swapaxes(x,0,1)
>>> y
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]], [[ 4, 5, 6, 7],
[16, 17, 18, 19]], [[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
>>> y.shape
(3, 2, 4)
7、np.transpose(a, axex=None) transpose方法排列数组a的形状。当axex为None时,返回的是数组a的转置。当axex为数组a轴的索引值的排列,如shape为[1,2,3,4]的数组a的axex为元组(2,1,3,0)或列表[2,1,3,0]时,表示数组a的shape变为了(第2轴,第1轴,第3轴,第0轴)的长度。
>>> a = np.ones((1, 2, 3, 4))
>>> np.transpose(a).shape
(4, 3, 2, 1)
>>> np.transpose(a,(2,1,3,0)).shape
(3, 2, 4, 1)
>>> a.T.shape
(4, 3, 2, 1)
当axex为None时,np.transpose(a)与a.T是等价的。
8、np.atleast_1d(array1,array2,...) atleast_1d方法将输入视为至少一维的数组,将输入数组放置到一个列表里。与直接创建list不同的是,把输入的每个对象都转换为了数组对象。atleast_2d方法将输入视为至少二维的数组,atleast_3d方法将输入视为至少三维的数组。其实就是把输入数组中维度高于一维/二维/三维的数组原样输出,低于一维/二维/三维的数组升至一维/二维/三维输出,把结果放入一个列表中。
>>> x = np.arange(0, 24).reshape(2, 3, 4)
>>> np.atleast_1d(x,[2,3],1)
[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]]]),
array([2, 3]), array([1])]
>>> [x,[2,3],1]
[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]]]),
[2, 3], 1]
>>> np.atleast_2d(x,[2,3],1)
[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]]]), array([[2, 3]]), array([[1]])]
>>> np.atleast_3d(x,[2,3],1)
[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]]]),
array([[[2],[3]]]), array([[[1]]])]
atleast_1d中,[2, 3]被转换为shape为(2, );atleast_1d中,[2, 3]被转换为shape为(1, 2);atleast_1d中,[2, 3]被转换为shape为(1, 2, 1)。先把整个数组当作一个元素升一维,再把数组中的每个数字当作一个元素升一维。
9、np.broadcast(a, b) broadcast方法创建并返回一个数组a和b的广播对象y。y只能通过迭代器获取内容,并且有.shape、.index等方法,表示广播结果的形状和索引。广播是指,如果数组a和b的形状不相同则对不相同的轴的值进行排列组合。
>>> a = np.array([[1],[2]])
>>> b = np.array([[4, 5, 6,7]])
>>> a.shape, b.shape
((2, 1), (1, 4))
>>> y = np.broadcast(a, b)
>>> y
<numpy.broadcast at 0x213aa462050>
>>> y.shape
(2, 4)
>>> for (u,v) in y:
print(u, v, '\t', b.index)
1 4 1
1 5 2
1 6 3
1 7 4
2 4 5
2 5 6
2 6 7
2 7 8
10、np.broadcast_to(a, shape) broadcast_to方法把数组a广播并返回为形状为shape的数组。shape的形式应为new_shape+a.shape,即如需要把a广播为(m, n)次,a.shape=(q, w),则shape应为(m,n,q,w)。
>>> a = np.array([[1,2],[3,4]])
>>> a.shape
(2, 2)
>>> b = np.broadcast_to(a, (3,3,2,2))
array([[[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]]],
[[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]]],
[[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]]]])
>>> b.shape
(6, 4, 2, 2)
11、np.broadcast_array(a, b) broadcast_array方法获取广播的数组,返回的是包含广播数组的列表。
>>> a = np.array([[1,2,3]])
>>> b = np.array([[4],[5]])
>>> np.broadcast_arrays(a, b)
[array([[1, 2, 3],
[1, 2, 3]]),
array([[4, 4, 4],
[5, 5, 5]])]
12、np.expand_dims(a, axis) expand_dims方法返回扩展输入数组a的形状的数组,在axis轴位置添加新轴。
>>> x = np.array([[1,2],[3,4]])
>>> x.shape
(2, 2)
>>> y = np.expand_dims(x, 0)
>>> y
array([[[1, 2],
[3, 4]]])
>>> y.shape
(1, 2, 2)
>>> z = np.expand_dims(x, 1)
>>> z
array([[[1, 2]],
[[3, 4]]])
>>> z.shape
(2, 1, 2)
>>> w = np.expand_dims(x, 2)
>>> w
array([[[1],
[2]],
[[3],
[4]]])
>>> w.shape
(2, 2, 1)
13、在reshape等API中,都有order{'C', 'F', 'A'}参数,默认为'C'。其含义主要影响数组的索引速度,'C'表示使用类似C语言的索引顺序读取/写入元素,最后一个轴索引更改最快,回到第一个轴索引更改最快。 'F'表示使用类似Fortran语言的索引顺序读取/写入元素,第一个索引更改最快,最后一个索引更改最慢。 'C'和'F'选项不考虑基础数组的内存布局,仅指索引的顺序。 'A'表示如果数组在内存中是连续的,则以类似于Fortran语言的索引顺序读取/写入元素,否则为类似于C语言的顺序。
参考:numpy中文文档:https://www.numpy.org.cn/reference/
numpy英文文档:https://numpy.org/doc/1.17/reference/index.html
iwehdio的博客园:https://www.cnblogs.com/iwehdio/
numpy的基本API(二)——维数操作的更多相关文章
- 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...
- DotNet二维码操作组件ThoughtWorks.QRCode
DotNet二维码操作组件ThoughtWorks.QRCode 在生活中有一种东西几乎已经快要成为我们的另一个电子"身份证",那就是二维码.无论是在软件开发的过程中,还是在普通用 ...
- python的二维数组操作
需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0] ...
- 06-01 Java 二维数组格式、二维数组内存图解、二维数组操作
二维数组格式1 /* 二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的 ...
- HihoCoder - 1336 二维数状数组(单点更新 区间查询)
You are given an N × N matrix. At the beginning every element is 0. Write a program supporting 2 ope ...
- 谷歌api 二维码生成 实例
谷歌提供的二维码生成器接口,非常实用!分享给大家 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- numpy基础教程--将二维数组转换为一维数组
1.导入相应的包,本系列教程所有的np指的都是numpy这个包 1 # coding = utf-8 2 import numpy as np 3 import random 2.将二维数组转换为一维 ...
- 整理:python的二维数组操作
Python中初始化一个5 x 3每项为0的数组,最好方法是: multilist = [[0 for col in range(5)] for row in range(3)] 如果初始化一个二维数 ...
- python二维码操作:QRCode和MyQR入门
1.QRCode QRCode最简单的使用 import qrcode qrcode.make("第一个二维码").get_image().show() 根据文本生成二维码并且直接 ...
随机推荐
- 使用Bootstrap制作简单的旅游主页
页面效果 代码: 需要导入bootstrapt文件,解压至项目中. 下载地址:https://v3.bootcss.com/getting-started/#download <!DOCTYPE ...
- linux中dd相关命令骚操作
一.dd如何快速将磁盘写满 方法一: dd if=/dev/zero of=/tmp/file bs=1G count=10 # 参数解释 1. if=文件名:输入文件名,缺省为标准输入.即指定源文件 ...
- 架构设计:"4+1"视图
概念 "4+1"视图,是指从5个不同视角来描述软件体系结构. "4+1"分别指: 逻辑视图 过程视图 物理视图 开发视图 场景/用例 视图 逻辑架构的描述可以围 ...
- 为企业应用开发提速,写给企业IT部门的低代码开发基础知识
简介:应用程序开发长期以来一直是IT部门和业务部门面临的问题. IT部门总是被新的应用程序需求弄得不堪重负.他们不可能完成业务部门想要完成的每一个项目. 同时,业务部门的用户厌倦了等待,并开始完全绕过 ...
- ArcGIS API For Javascript:热力图不同级别下的优化方法
我们在地图缩放的不同级别下,热力图的显示效果会不同,由于点密度与模糊参数默认是固定的,因此需要对参数进行动态修改,以满足不同缩放级别下可以得到较好的显示效果. 思路是监听地图缩放级别,将地图缩放级别作 ...
- 🔥《手把手》系列基础篇之2-python+ selenium-打开和关闭浏览器(详细)
1. 简介 本节介绍如何初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打开fiefox浏览器.首先需要去下载一个driver插件geckod ...
- 移动端vue项目的图片上传插件
有一移动端项目,使用的vant-ui.可是vant自带的Uploader似乎不支持一次选择多张图片上传的功能. 于是乎:在https://www.npmjs.com/查找发现找到 vue-upload ...
- 软件测试从业者必备的高频Linux命令
命令 cd 1.如何进入上级目录 cd .. 2.如何进入当前用户主目录 cd ~ 3.如何进入上两级目录 cd ../.. 4.进入当前目录命令 cd . 5.如何进入目录 /usr/isTeste ...
- 线程中synchronized关键字和lock接口的异同
一.synchronized关键字 1.可以用来修饰代码块 synchronized (this) { // 同步的关键字 this 表示当前线程对象 if (num == 0) { break; } ...
- Android性能优化总结
合理的管理内存 节制地使用Service,尽量使用IntentService 避免在Bitmap上浪费内存,压缩图片处理 谨慎使用抽象编程 尽量避免会用依赖注入框架 使用ProGuard简化代码,好处 ...