2

一文弄懂numpy数组

 1 year ago
source link: https://blog.csdn.net/luoluopan/article/details/126357310
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

学习数据分析,必绕不开numpy和pandas这两个库,numpy的ndarray数据结构和矩阵数据非常类似,最近搞科研的时候总是会用到,之前学的都忘记完了,所以,这次打算把numpy库的基本用法记录在一篇文章里,以便后面复习和使用。

ndarray多维数组创建

不要管复杂的概念,我们把多维数组看做成矩阵就行(实际使用中也是这样的),例如,下面的二维数据,我们就可以看做成2行3列的矩阵。

一切从创建说起

一个特定的数据结构,肯定有着特定的创建方式,例如列表我们就是通过[]来创建,字典我们用{}来创建。ndarray多维数组用numpy库的array方法来创建。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
  • object 数组或嵌套的数列(列表,元祖,数组,或者其他序列类型)

  • dtype 数组元素的数据类型,可选

  • copy 对象是否需要复制,可选

  • order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)

  • subok 默认返回一个与基类类型一致的数组

  • ndmin 指定生成数组的最小维度



newCodeMoreWhite.png
特殊创建方式

numpy也提供了一些函数用于创建特殊的数组。

  • zeros,全为0数组;

  • ones,全为1数据;

  • empty,垃圾值数组。

  • full,填充任意值

b2d8b00746c818f7883009c6c7ebb514.png
fcaee53b1c8d536cb207769f387b4bdd.png
数值范围创建数组

我们做循环的时候经常会用到range,可以取数值范围,numpy中有个arange函数,可用于创建数组。

这样创建的数组只能是一维的,arange函数经常和reshape一起使用(后面还会介绍),可以创建多维的数组。

ndarray数据属性

属性我们常需要调用的就是ndim,shape和dtype。

  • ndarray.ndim 秩,即轴的数量或维度的数量

  • ndarray.shape 数组的维度,对于矩阵,n 行 m 列

  • ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值

  • ndarray.dtype ndarray 对象的元素类型

  • ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位

  • ndarray.flags ndarray 对象的内存信息

  • ndarray.real ndarray元素的实部

  • ndarray.imag ndarray 元素的虚部

  • ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元- 素,所以通常不需要使用这个属性。

改变数组数据类型

这个我们经常会用到,例如我们把整数数组转换为浮点数数组,使用astype方法,用np.float64和'float64'都可以。

376fc47d9e9174cfe6d3ca85dcb2ea80.png

切片和索引

这部分内容非常重要,我们经常要选取特定的部分数据来操作,这里就必须要用到切片和索引。

和列表的切片和索引很类似,都是从0开始计数,一维数组很简单,也很好理解(和列表一样操作就行),这里就不多介绍了。

二维数组,选取数据无非就以下几种情况,选取特定的行,特定的列,或者组合,我们来看看怎么写。

d0113cf1c9aa7849cd026eb92ccddb47.png
fa30c72a2b690d45a60f2a240d49ffc9.png

特定的行和列,这部分就有点不一样了,如果行或者列中有切片,就能得到我们想要的结果,例如获取2,3行以及1,3列。

d2c5ac11fe3b027edf2089fde0079f18.png

如果我们想要获取1,3行以及1,3列,用这种写法结果就不对。

296917c7a5b5f2b558d496cc00381d14.png

这其实获取的是第一行第一列以及第三行第三列的值,这时候我们就需要用到花式索引。

要使用np.ix_来完成。

0c7b225c5abeb56812918946932d35fe.png

其实不用这样写也可以,就是稍微复杂一点。我们先选取第一行和第三行,选完之后,再选取列。

2025e68ed103afe29020799e996fc63e.png

还有一个很重要的概念,就是布尔索引。

5bd0769cc37357e527c216f5c28ca0ff.png
f1c9ce9d0fd5f2537f12c5090dbc473a.png

这里有两个函数需要介绍下,一个是all,一个是any,all是都为True,就返回True,any是一个为True,就返回True。

修改数组形状

之前我们简单了解过reshape方法,可以改变数组的形状。通过flatten或者ravel可以将数组从新进行展开。

91f652ad558986192678709510c0ec00.png
合并和分割数组

合并数组主要有以下几种方法:

  • concatenate 连接沿现有轴的数组序列

  • stack 沿着新的轴加入一系列数组。

  • hstack 水平堆叠序列中的数组(列方向)

  • vstack 竖直堆叠序列中的数组(行方向)

e16164213b910b167397e96548a902ae.png

axis参数就是制定轴的方向,很多numpy函数都有这个参数,但是这个轴又不是很好理解,网上有很多的解释,我这里说一个很简单的解释。例如二维数组,我们索引的时候arr[i,j],i就代表0,j就代表1,也就是说,行的方向就是0,列的方向就是1。

b7e18cf69e4abef3b1d5a795d6495a0c.png
5b3cd04051c9505ebd0bc307ceb83f65.png

分割数组的函数为:

  • split 将一个数组分割为多个子数组

  • hsplit 将一个数组水平分割为多个子数组(按列)

  • vsplit 将一个数组垂直分割为多个子数组(按行)

numpy.split(ary, indices_or_sections, axis)
  • ary:被分割的数组

  • indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)

  • axis:设置沿着哪个方向进行切分,默认为 0,横向切分,即水平方向。为 1 时,纵向切分,即竖直方向

c58eb923cde16dcbdf27f58ec95ef475.png
  • resize 返回指定形状的新数组

  • append 将值添加到数组末尾

  • insert 沿指定轴将值插入到指定下标之前

  • delete 删掉某个轴的子数组,并返回删除后的新数组

  • unique 查找数组内的唯一元素

这里要注意的是,如果不指定轴修改数组,会返回一维数组。

c2b76569640f129adf04c8845e280908.png

numpy.unique 函数用于去除数组中的重复元素。

numpy.unique(arr, return_index, return_inverse, return_counts)
  • arr:输入数组,如果不是一维数组则会展开

  • return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储

  • return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储

  • return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

2e86ad2ecc22ed5899b2c890ff4f9904.png
  • transpose 对换数组的维度

  • ndarray.T 和 self.transpose() 相同

  • rollaxis 向后滚动指定的轴

  • swapaxes 对换数组的两个轴

667c26c224f8f624666eb1654f8e1ed2.png

numpy.rollaxis 函数向后滚动特定的轴到一个特定位置,格式如下:

numpy.rollaxis(arr, axis, start)

参数说明:arr:数组 axis:要向后滚动的轴,其它轴的相对位置不会改变 start:默认为零,表示完整的滚动。会滚动到特定位置。

340bca84d81c5bc336edf341e38b2958.png

numpy.swapaxes 函数用于交换数组的两个轴。

6fc47c143eac4f2eb918485dc2d3e51f.png

数学和统计函数

numpy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等。这里就不一一介绍了,我们着重了解下复数处理函数。

numpy.around() 函数返回指定数字的四舍五入值。

numpy.around(a,decimals)

numpy.floor() 返回小于或者等于指定表达式的最大整数,即向下取整。

numpy.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整。

这里不一一介绍了,大家需要用到的时候自查即可。

  • add,相加

  • subtract,相减

  • multiply,相乘

  • divide,相除

  • reciprocal,函数返回参数逐元素的倒数。如 1/4 倒数为 4/1

  • power,第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂

  • mod,计算输入数组中相应元素的相除后的余数。函数 numpy.remainder() 也产生相同的结果。

numpy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等。sum,average等等,可以去numpy的官方文档了解更多。

numpy.where() 函数返回输入数组中满足给定条件的元素的索引。

9abedfd8783b1de5831aef98823048a7.png

numpy.extract() 函数根据某个条件从数组中抽取元素,返回满条件的元素。

a264990a8fa88f788a35a4746ff11f88.png

文件的存储与读取

  • load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。

  • savez() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。

  • loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)。

e2399ee6d711efc336762d5be650c101.png
b6f2a318f27f7e0fc473d02c794334d6.png

savetxt() 函数是以简单的文本文件格式存储数据,对应的使用 loadtxt() 函数来获取数据。

numpy是Python数据科学必学的第三方库,但是说实话,一上来就学numpy其实是很痛苦的,他不像pandas那么直观,有很多实际的有趣的案例,所以本篇文章主要是将numpy的基础语法记录下来,供大家和自己以后查询所使用,最后附上numpy小抄给大家,我们下期再见。

edc8cef48a0cb6439ea9ad551bdfe8b1.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK