• 一文弄懂numpy数组


    前言

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

    ndarray多维数组创建

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

    1. import numpy as np
    2. b = np.array([[1,2,3],[4,5,6]])
    3. print(b)
    4. # [[1 2 3]
    5. # [4 5 6]]
    一切从创建说起

    一个特定的数据结构,肯定有着特定的创建方式,例如列表我们就是通过[]来创建,字典我们用{}来创建。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 指定生成数组的最小维度

    1. # 1维数组
    2. a = np.array([1,2,3])
    3. print(a)
    4. # [1,2,3]
    5. # 2维数组
    6. b = np.array([[1,2,3],[4,5,6]])
    7. print(b)
    8. # [[1 2 3]
    9. # [4 5 6]]
    10. # 指定数据类型
    11. c = np.array([[1,2,3],[4,5,6]], dtype = np.float64)
    12. print(c)
    13. # reslut
    14. [[1. 2. 3.]
    15. [4. 5. 6.]]
    特殊创建方式

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

    • zeros,全为0数组;

    • ones,全为1数据;

    • empty,垃圾值数组。

    • full,填充任意值

    4e626ac2e1651aeb79f8f3cfdcd268c2.png 80177d7b3e28f33029f100af2eeb212f.png
    数值范围创建数组

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

    1. arr4 = np.arange(9)
    2. arr4
    3. # [0, 1, 2, 3, 4, 5, 6, 7, 8]

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

    1. arr5 = np.arange(9).reshape(3,3)
    2. arr5
    3. array([[0, 1, 2],
    4. [3, 4, 5],
    5. [6, 7, 8]])

    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 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元- 素,所以通常不需要使用这个属性。

    1. arr5 = np.arange(9).reshape(3,3)
    2. print(arr5.ndim)
    3. print(arr5.shape)
    4. print(arr5.dtype)
    5. 2
    6. (3, 3)
    7. int64
    改变数组数据类型

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

    d8b0a7a9f1ecbc4a2f30aea3e6f80e35.png

    切片和索引

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

    小试牛刀

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

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

    特定行

    66e4e4f973269b4949ff8131d22ac38c.png

    特定列

    715e21f1989e924fa551d6ca080c4c33.png

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

    835d4d8839b9f15985dd49f12be7f743.png

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

    5fb4a4cff76482786f8f9b307c70d935.png

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

    花式索引

    要使用np.ix_来完成。

    47612c17a6a7d8d889aa6252fcf356cf.png

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

    24e77755884fb80be54b7aae2306452d.png
    布尔索引

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

    94797c36c66bab0f0c05927caba5a6c7.png 784bf3dfa0974158d19ef33d887e17ef.png

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

    数组操作

    修改数组形状

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

    4f42855ffe15d64bd14c3440d0698f92.png
    合并和分割数组

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

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

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

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

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

    5927b3fdc995c02c0acb18a694c18446.png

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

    a282ea8925ae1ed8ab4a875ff1ef0bff.png 9b4faf0743f92c4214698a0e4d6b1966.png

    分割数组的函数为:

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

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

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

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

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

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

    b43c3f287b100fd0d8d688c86bcbc7b9.png
    修改数组
    • resize 返回指定形状的新数组

    • append 将值添加到数组末尾

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

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

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

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

    4162c842d8402dfc73bace2907dad314.png

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

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

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

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

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

    7d366cc121094cb97d56e09b57f1be39.png
    翻转数组
    • transpose 对换数组的维度

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

    • rollaxis 向后滚动指定的轴

    • swapaxes 对换数组的两个轴

    323cdd9120ad18ecd18968d6cb033aea.png

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

    numpy.rollaxis(arr, axis, start)

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

    adb37ec5ce666282ce8d629fd22f62e5.png

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

    d763f5c94bdc222b12da727b78cc790b.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() 函数返回输入数组中满足给定条件的元素的索引。

    bff4f6dff2fa1b89834bc0920ae8b23a.png

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

    0f250aefa800ea1a135090f576415b5e.png

    文件的存储与读取

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

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

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

    2e2aa889d4bce8cf27d73491505aa7a4.png f9822e4c8580ddbafd513c3cf2c56ae1.png

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

    1. np.loadtxt(FILENAME, dtype=int, delimiter=' ')
    2. np.savetxt(FILENAME, a, fmt="%d", delimiter=",")

    总结

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

    7a9b00d19dc06b5f7a258ec95eb0a4aa.png
  • 相关阅读:
    框架外的PHP读取.env文件(php5.6、7.3可用版)
    70个让你笑爆肚皮的程序员段子
    任务调度框架 Quartz 一文读懂
    LCD DRM component 框架分析
    代谢组学分析平台(二)
    视频封面:从视频中提取封面,轻松制作吸引人的视频
    STM32CubeMX配置生成FreeRTOS项目
    在 Java 中,如何创建泛型对象与泛型数组
    工业相机基本知识理解:帧率、带宽(数据接口)、图像数据格式
    模拟Proactor模式实现 I/O 处理单元
  • 原文地址:https://blog.csdn.net/luoluopan/article/details/126357310