首页 > 其他分享 >【numpy基础】--基础操作

【numpy基础】--基础操作

时间:2023-06-20 16:25:07浏览次数:31  
标签:arr -- 基础 np range 数组 print array numpy

numpy作为一个强大的数值计算库,提供了对多维数组的很多便捷操作。
承接上一篇数组的创建,本篇主要介绍一些数组的基本操作。

1. 子数组

首先介绍获取子数组的方法,提取已有数据的一部分来参与计算是比较常用的功能。

对于一维数组,提取子数组:arr[start:stop:step]

  1. start:从哪个下标开始(下标从 0 开始)
  2. stop:到哪个下标结束(下标不包括 stop 这个值)
  3. step:间隔几个元素
arr = np.array(range(10))  # 生成 0~9 10个元素
print(arr[::2]) # 偶数
print(arr[1::2]) # 奇数
print(arr[1:6:2]) # 前六个数中的奇数
print(arr[::-1]) # 逆序

#运行结果
[0 2 4 6 8]
[1 3 5 7 9]
[1 3 5]
[9 8 7 6 5 4 3 2 1 0]

对于多维数组,同样可以使用上面的方式,数组有几维,就可以使用几次 start:stop:step
比如下面的二维数组:

arr = np.array([range(6), range(1, 7),
                range(2, 8), range(3, 9),
                range(4, 10)])
print(arr)
#运行结果
[[0 1 2 3 4 5]
 [1 2 3 4 5 6]
 [2 3 4 5 6 7]
 [3 4 5 6 7 8]
 [4 5 6 7 8 9]]

print(arr[::2, ::2])
#运行结果
[[0 2 4]
 [2 4 6]
 [4 6 8]]

也就是按行取第 1,3,5行,然后按列取第 1,3,5列。

2. 数组副本

当我们提取子数组之后,如果对子数组进行修改,那么原始的数组也会变化。
这个因为数组是引用类型,当数组的数据量很大的时候,内存占用会比较低。
比如:

arr = np.array(range(5))
arr2 = arr[::2]
arr2[2] = 99

print(arr)
#运行结果
[ 0  1  2  3 99]

print(arr2)
#运行结果
[ 0  2 99]

子数组修改之后,原始数组也改变了。

如果要避免修改原始数组,就要建立子数组的副本,也就是 copy 方法。

arr = np.array(range(5))
arr2 = arr[::2].copy() # 通过copy方法建立副本
arr2[2] = 99

print(arr)
#运行结果
[0 1 2 3 4]

print(arr2)
#运行结果
[ 0  2 99]

3. 数组变形

进行数据分析时,我们常常得到的是线性的数据序列,也就是一维数组,
numpy中,从一维变到多维非常方便。

#一维变多维
arr = list(range(9))
print(arr)
#运行结果
[0, 1, 2, 3, 4, 5, 6, 7, 8]

arr = np.array(arr).reshape((3, 3))
print(arr)
#运行结果
[[0 1 2]
 [3 4 5]
 [6 7 8]]

注意,变换前后元素的总数量要一直,比如上面的例子中,
变换前一维数组有9个元素,变换成 3x3 的二维数组,也是9个元素。
如果变换成 3x4 或者 2x3 的二维数组,就会出错。

除了二维数组,变成三维数组也一样:

arr = np.array(range(24)).reshape((2, 3, 4))

print(arr)
#运行结果
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

4. 拼接和拆分

最后一个基本操作是数组的拼接拆分

4.1. 拼接

拼接有两个方向,水平拼接和垂直拼接,拼接的数组个数不限。
比如,下面的示例是3个数组拼接在一起。

arr1 = np.array([range(1, 4),
                 range(1, 4),
                 range(1, 4)])
arr2 = np.array([range(4, 7),
                 range(4, 7),
                 range(4, 7)])
arr3 = np.array([range(7, 10), 
                 range(7, 10),
                 range(7, 10)])

arr = np.concatenate([arr1, arr2, arr3])
print(arr)
#运行结果
[[1 2 3]
 [1 2 3]
 [1 2 3]
 [4 5 6]
 [4 5 6]
 [4 5 6]
 [7 8 9]
 [7 8 9]
 [7 8 9]]

arr = np.concatenate([arr1, arr2, arr3], axis=1)
print(arr)
#运行结果
[[1 2 3 4 5 6 7 8 9]
 [1 2 3 4 5 6 7 8 9]
 [1 2 3 4 5 6 7 8 9]]

concatenate 函数用来拼接数组,默认是垂直方向拼接,设置 axis=1,按照水平方向拼接。

如果觉得记参数麻烦,记不住哪个是水平拼接,哪个是垂直拼接,还有两个专门拼接的函数,
vstack(垂直拼接)和hstack(水平拼接)。

arr = np.vstack([arr1, arr2, arr3])
print(arr)
#运行结果
[[1 2 3]
 [1 2 3]
 [1 2 3]
 [4 5 6]
 [4 5 6]
 [4 5 6]
 [7 8 9]
 [7 8 9]
 [7 8 9]]

arr = np.hstack([arr1, arr2, arr3])
print(arr)
#运行结果
[[1 2 3 4 5 6 7 8 9]
 [1 2 3 4 5 6 7 8 9]
 [1 2 3 4 5 6 7 8 9]]

4.2. 拆分

拆分数组时,通过设置拆分点的下标,可以将数组拆分成任意长短的多个数组。
比如:

arr = np.array(range(1, 10))
arr1 = np.split(arr, [1, 5]) # 在下标 1 和 5 的地方拆分
print(arr1)
#运行结果
[array([1]), array([2, 3, 4, 5]), array([6, 7, 8, 9])]

上面的示例中,下标1对应的值是2下标5对应的值是6
2个拆分点,所以拆分成3个数组

同样,数组的拆分也有2个简便的方法:vsplithsplit
拆分多维数组时,可以按照垂直和水平两个方向拆分。

arr = np.array(range(1, 10)).reshape((3, 3))
print(arr)
#运行结果
[[1 2 3]
 [4 5 6]
 [7 8 9]]

print(np.vsplit(arr, [1]))
#运行结果
[array([[1, 2, 3]]), 
 array([[4, 5, 6],
       [7, 8, 9]])]

print(np.hsplit(arr, [1]))
#运行结果
[array([[1],
       [4],
       [7]]), 
 array([[2, 3],
       [5, 6],
       [8, 9]])]

垂直拆分时,拆分点是下标1的行,也就是从第二行开始拆分。
水平拆分时,拆分点是下标1的列,也就是从第二列开始拆分。

超过二维的数组也可以 vsplithsplit,只是结果看上去没那么直观。

5. 总结回顾

本篇主要介绍的是numpy数组的基本操作,包括:

  1. 提取子数组
  2. 创建数组副本
  3. 数组变形
  4. 拼接和拆分

这些基本操作是进行实际的数值计算前经常会使用到的。

标签:arr,--,基础,np,range,数组,print,array,numpy
From: https://www.cnblogs.com/wang_yb/p/17493320.html

相关文章

  • 7. RESTful
    1.RESTful简介‍REST:RepresentationalStateTransfer,表现层资源状态转移。①资源‍资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件、......
  • UE5 C++ UPROPERTY宏
    属性声明UPROPERTY([specifier,specifier,...],[meta(key=value,key=value,...)])TypeVariableName;属性说明符声明属性时,属性说明符可被添加到声明,以控制属性与引擎和编辑器诸多方面的相处方式常用说明符VisibleDefaultsOnly//仅在ClassDefaults可见UP......
  • 探索網絡時代的注意力管理:如何平衡專注與捕捉
    在這個資訊爆炸的時代,如何有效地管理我們的注意力,並在專注與捕捉之間找到平衡,已經成為我們面臨的一個重要問題。專注模式與捕捉模式是我們在生活與工作中交替運用的兩種不同的注意力模式,而如何在兩者之間取得平衡,則是高效注意力管理的關鍵。然而,網絡時代為我們帶來的資訊超載和注......
  • CH583,CH582,CH581 国产蓝牙芯片RISC-V内核BLE 5.3无线MCU
    概述CH583是集成BLE无线通讯的32位RISC微控制器。片上集成2Mbps低功耗蓝牙BLE通讯模块、2个全速USB主机和设备控制器及收发器、2个SPI、4个串口、ADC、触摸按键检测模块、RTC等丰富的外设资源。CH583相比CH582多了SP11主机,支持最低1.7V电源电压。CH581基于CH582简化,去掉了-......
  • 【Podman Desktop】配置镜像源加速
    配置Podmandesktop镜像源加速打开阿里云https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,复制里面的加速地址打开window的Powershell,输入wsl进入linux子系统sudovi/etc/containers/registries.conf#输入命令,修改该文件添加如下内容后,使用wq保存退......
  • JPA在事务结束时自动更新查询数据
    目录现象产生的原因解决方法现象最近解决了一个困惑几天的bug,数据库里的某一些记录莫名其妙的被刷新了,排查过代码跟应用日志,可以确定不是代码执行的更新。直到今天看到了一条日志,在事务提交时报错“Column'user_name'cannotbenull”,在出错的事务中,针对这一个表只会执行query......
  • linux 常用命令
    目录统计文件和文件夹个数当前文件夹文件个数文件夹个数递归文件夹文件个数文件夹个数查看内存占用率统计文件夹占用大小显示磁盘信息Vim小应用回显terminal到vim大文件压缩服务器设置方面时间UbuntuCentOS压缩,解压,查看目录小工具进制转换crontab语法快速复制小文件软件卸载......
  • React 性能優化:使用 memo、useCallback、useMemo
    在寫網頁時,我們通常習慣把一個頁面切割成很多的元件(Component),讓我們容易組織與管理頁面的組成。但是在React中複雜的元件關係,如果沒有經過優化,將有可能會造成性能上的問題。在FunctionComponent中,重新渲染(re-render)很輕易就會被觸發,少量的元件時還不會發生太大的問......
  • kubernetes 服务发现
    服务发现概述通常,稍有规模的系统架构需要抽象楚相当数量的服务,这些服务间可能存在复杂的依赖关系和通信模型,考虑到容器编排环境的动态特性,让客户端获知服务端的地址便成了难题之一。kubernetes系统上的Service为pod中的服务类应用提供了一个固定的访问入口,但pod客户端中的应用还......
  • Diffusers框架使用Civitai上的checkpoit和lora模型
    1、实验室有一台带显卡的机器,能访问huggingface但访问不了Civitai,而Civitai上的模型多是webui训练来的也不能直接用到diffusers框架上,于是需要利用Colab把Civitai上的模型转化成diffusers可用再上传到huggingface上,再下载到本地。2、googlecolab上新建一个笔记本,再选修改==》笔......