1 简介

  NumPy 是用于处理数组的 python 库,部分用 Python 编写,但是大多数需要快速计算的部分都是用 C 或 C ++ 编写的。它还拥有在线性代数、傅立叶变换和矩阵领域中工作的函数。NumPy 由 Travis Oliphant 于 2005 年创建。它是一个开源项目,您可以自由使用它。NumPy 指的是数值 Python(Numerical Python)。

  在 Python 中,我们有满足数组功能的列表,但是处理起来很慢。NumPy 旨在提供一个比传统 Python 列表快 50 倍的数组对象。与列表不同,NumPy 数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操纵它们。这种行为在计算机科学中称为引用的局部性。这是 NumPy 比列表更快的主要原因。它还经过了优化,可与最新的 CPU 体系结构一同使用。NumPy 中的数组对象称为 ndarray,它提供了许多支持函数,使得利用 ndarray 非常容易。数组在数据科学中非常常用,因为速度和资源非常重要。

2 NumPy 入门

2.1 安装NumPy

pip install numpy

如果安装失败,可指定国内源安装,例:指定豆瓣源。

pip install numpy -i http://pypi.douban.com/simple/

2.2 导入NumPy

import numpy as np 

arr = np.array([1, 2, 3, 4, 5])
print(arr)

2.3 检查 NumPy 版本

import numpy as np

print(np.__version__)

3 NumPy的基本操作

3.1 数组创建

import numpy as np 

#0维
arr = np.array(61)
#一维
arr1 = np.array([1, 2, 3, 4, 5])
#二维
arr2= np.array([[1, 2, 3], [4, 5, 6]])
#三维
arr3= np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]]) #检查维数
print(arr3.ndim) #创建高维数组
arr5= np.array([1, 2, 3, 4], ndmin=5) print(arr5)
print('number of dimensions :', arr5.ndim)

3.2 数组索引

import numpy as np

#访问数组元素
#NumPy 数组中的索引以 0 开头,这意味着第一个元素的索引为 0,第二个元素的索引为 1,以此类推。
arr = np.array([1, 2, 3, 4])
print("第一个元素:",arr[0])
print("第三个元素和第四个元素相加:",arr[2] + arr[3]) #访问2维数组
arr = np.array([[1,2,3,4,5], [6,7,8,9,10]])
print('第一维中的第二个元素: ', arr[0, 1])
#访问3维数组
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print("第一个数组的第二个数组的第三个元素",arr[0, 1, 2]) #负索引。使用负索引从尾开始访问数组。
arr = np.array([[1,2,3,4,5], [6,7,8,9,10]])
print('第二个维中的的最后一个元素: ', arr[1, -1])

运行结果:

第一个元素: 1
第三个元素和第四个元素相加: 7
第一维中的第二个元素: 2
第一个数组的第二个数组的第三个元素 6
第二个维中的的最后一个元素: 10

3.3 数组裁切

python 中裁切的意思是将元素从一个给定的索引带到另一个给定的索引。

我们像这样传递切片而不是索引:[startend]。

我们还可以定义步长,如下所示:[startendstep]。

如果我们不传递 start,则将其视为 0。

如果我们不传递 end,则视为该维度内数组的长度。

如果我们不传递 step,则视为 1。

实例:

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7])
print("裁切索引 1 到索引 5 的元素",arr[1:5])
print("裁切数组中索引 4 到结尾的元素",arr[4:])
print("裁切从开头到索引 4(不包括)的元素",arr[:4])
#负裁切
print("末尾开始的索引 3 到末尾开始的索引 1",arr[-3:-1])
print("从索引 1 到索引 5,步长为2",arr[1:5:2]) #裁切二维数组
arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
print("从第二个元素开始,对从索引 1 到索引 4(不包括)的元素进行切片;",arr[1, 1:4])

运行结果:

裁切索引 1 到索引 5 的元素: [2 3 4 5]
裁切数组中索引 4 到结尾的元素: [5 6 7]
裁切从开头到索引 4(不包括)的元素: [1 2 3 4]
末尾开始的索引 3 到末尾开始的索引 1: [5 6]
从索引 1 到索引 5,步长为2: [2 4]
从第二个元素开始,对从索引 1 到索引 4(不包括)的元素进行切片; [7 8 9]

3.4 数组类型

默认情况下,Python 拥有以下数据类型:

  • strings - 用于表示文本数据,文本用引号引起来。例如 "ABCD"。
  • integer - 用于表示整数。例如 -1, -2, -3。
  • float - 用于表示实数。例如 1.2, 42.42。
  • boolean - 用于表示 True 或 False。
  • complex - 用于表示复平面中的数字。例如 1.0 + 2.0j,1.5 + 2.5j。

NumPy 中所有数据类型的列表以及用于表示它们的字符。

  • i - 整数
  • b - 布尔
  • u - 无符号整数
  • f - 浮点
  • c - 复合浮点数
  • m - timedelta
  • M - datetime
  • O - 对象
  • S - 字符串
  • U - unicode 字符串
  • V - 固定的其他类型的内存块 ( void )

3.5 数组副本/视图

副本和视图的区别:

  副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。视图不拥有数据,对视图所做的任何更改都会影响原始数组,而对原始数组所做的任何更改都会影响视图。

实例:

import numpy as np

#副本
arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
arr[0] = 61
print(arr)
print(x)
#视图
arr1 = np.array([1, 2, 3, 4, 5])
x1 = arr.view()
arr1[0] = 61 print(arr1)
print(x1)

运行结果:

[61 2 3 4 5]
[1 2 3 4 5]
[61 2 3 4 5]
[61 2 3 4 5]

3.6 数组形状

  数组的形状是每个维中元素的数量。

import numpy as np

#获取数组的形状
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr.shape)

3.7 数组重塑

  重塑意味着更改数组的形状。数组的形状是每个维中元素的数量。通过重塑,我们可以添加或删除维度或更改每个维度中的元素数量

import numpy as np

#从 1-D 重塑为 2-D
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(4, 3)
print(newarr)
#从 1-D 重塑为 3-D
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(2, 3, 2)
print(newarr)
#展平数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
newarr = arr.reshape(-1)
print(newarr)

3.8 数组重塑

  迭代意味着逐一遍历元素。当我们在 numpy 中处理多维数组时,可以使用 python 的基本 for 循环来完成此操作。如果我们对 1-D 数组进行迭代,它将逐一遍历每个元素。

import numpy as np

#迭代1维
arr = np.array([1, 2, 3])
for x in arr:
print(x) arr = np.array([[1, 2, 3], [4, 5, 6]])
#迭代2维
for x in arr:
print(x)
for x in arr:
for y in x:
print(y)
#迭代3维
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
for x in arr:
print(x)
for x in arr:
for y in x:
for z in y:
print(z)
#使用 nditer() 迭代数组
for x in np.nditer(arr):
print(x)
#以字符串形式遍历数组:
for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S']):
print(x) # ndenumerate() 进行枚举迭代
#枚举以下 1D 数组元素:
arr = np.array([1, 2, 3])
for idx, x in np.ndenumerate(arr):
print(idx, x) #枚举以下 2D 数组元素:
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
for idx, x in np.ndenumerate(arr):
print(idx, x)

3.9 数组连接

连接两个数组:

import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.concatenate((arr1, arr2))
print(arr)

沿着行 (axis=1) 连接两个 2-D 数组:

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2), axis=1)
print(arr)
print(arr.shape)

使用堆栈函数连接数组

  堆栈与级联相同,唯一的不同是堆栈是沿着新轴完成的。我们可以沿着第二个轴连接两个一维数组,这将导致它们彼此重叠,即,堆叠(stacking)。我们传递了一系列要与轴一起连接到 concatenate() 方法的数组。如果未显式传递轴,则将其视为 0

import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.stack((arr1, arr2), axis=1)
print(arr)
print(arr.shape)

沿不同方向堆栈

import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr3 = np.array([7, 8, 9])
#沿行堆叠
arr = np.hstack((arr1, arr2,arr3))
print(arr)
print(arr.shape) #沿列堆叠
arr = np.vstack((arr1, arr2,arr3))
print(arr)
print(arr.shape) #沿行堆叠
arr = np.dstack((arr1, arr2,arr3))
print(arr)
print(arr.shape)

运行结果:

[1 2 3 4 5 6 7 8 9]
(9,)
[[1 2 3]
[4 5 6]
[7 8 9]]
(3, 3)
[[[1 4 7]
[2 5 8]
[3 6 9]]]
(1, 3, 3)

3.10 数组拆分

  拆分是连接的反向操作。连接(Joining)是将多个数组合并为一个,拆分(Spliting)将一个数组拆分为多个。我们使用 array_split() 分割数组,将要分割的数组和分割数传递给它。

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 3)
print(newarr)

分割二维数组

import numpy as np

arr = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]])
newarr = np.array_split(arr, 3)
print(newarr) #使用 hsplit() 方法将 2-D 数组沿着行分成三个 2-D 数组
newarr = np.hsplit(arr, 3)

3.11 数组搜索

  数组中搜索(检索)某个值,然后返回获得匹配的索引。要搜索数组,请使用 where() 方法

import numpy as np

arr = np.array([[1, 2, 3, 4, 5, 4, 4],[2, 2, 4, 3, 5, 4, 6]])
x = np.where(arr == 4)
print(x)
#将新值赋予索引结果
arr[x] =7
print(arr)

# 将所有4改为为0
array = np.where(arr==4, 0, arr)

运行结果:

(array([0, 0, 0, 1, 1], dtype=int64), array([3, 5, 6, 2, 5], dtype=int64))
[[1 2 3 7 5 7 7]
[2 2 7 3 5 7 6]]

3.12 数组过滤

直接从数组创建过滤器

import numpy as np

arr = np.array([61, 62, 63, 64, 65])
filter_arr = arr > 62
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)

3.13 随机

生成一个 0 到 100 之间的随机浮点数:

from numpy import random

#生成一个 0 到 100 之间的随机整数:
x1 = random.randint(100)
print(x1) #random 模块的 rand() 方法返回 0 到 1 之间的随机浮点数
#生成一个 0 到 100 之间的随机浮点数
x2 = random.rand()*100
print(x2)

生成随机数组

from numpy import random

#生成一个 1-D 数组,其中包含 5 个从 0 到 100 之间的随机整数:
x=random.randint(100, size=(5))
print(x) 生成有 3 行的 2-D 数组,每行包含 5 个从 0 到 100 之间的随机整数:
x2 = random.randint(100, size=(3, 5))
print(x2) #生成包含 5 个随机浮点数的 1-D 数组:
x3 = random.rand(5)
print(x3)

从数组生成随机数

choice() 方法使您可以基于值数组生成随机值。方法将数组作为参数,并随机返回其中一个值。

from numpy import random

x = random.choice([3, 5, 7, 9])
print(x) x2 = random.choice([3, 5, 7, 9], size=(3, 5))
print(x2)

NumPy的基本操作的更多相关文章

  1. (零)机器学习入门与经典算法之numpy的基本操作

    1.根据索引来获取元素* 创建一个索引列表ind,用来装载索引,当numpy数据是一维数据时:一个索引对应的是一个元素具体的例子如下: import numpy as np # 数据是一维数据时:索引 ...

  2. 数据分析之Numpy的基本操作

    Numpy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 1 创建 ndarray 使 ...

  3. 初识NumPy库-基本操作

    ndarray(N-dimensional array)对象是整个numpy库的基础. 它有以下特点: 同质:数组元素的类型和大小相同 定量:数组元素数量是确定的 一.创建简单的数组: np.arra ...

  4. 机器学习三剑客之Numpy库基本操作

    NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机 ...

  5. Numpy的基本操作和相关概念(一)

    基础操作 np.random.randn() 符合正态分布的数据 np.vstack((a,b)) 矩阵水平拼接 np.hstack((a,b)) 矩阵垂直拼接 np.dot(a,c) 点阵积 A@B ...

  6. numpy.array 基本操作

    import numpy as np np.random.seed(0) x = np.arange(10) x """ array([0, 1, 2, 3, 4, 5, ...

  7. Python numpy的基本操作你一般人都不会

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.  PS:如有需要最新Python学习资料的小伙伴可以加点击下方链接自行获取 ...

  8. python numpy的基本操作

    站长资讯平台:文章目录0.NumPy 与 ndarry1.数组属性查看:类型.尺寸.形状.维度2.numpy元素中数据存储方式,数据类型,类型转换2.1 查看元素数据存储类型2.2 元素数据存储类型转 ...

  9. Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

    一:数组的属性 每个数组都有它的属性,可分为:ndim(数组的维度),shape(数组每个维度的大小),size(数组的总大小),dtype(数组数据的类型) 二:数组索引 和python列表一样,N ...

随机推荐

  1. Spring Boot中使用时序数据库InfluxDB

    除了最常用的关系数据库和缓存之外,之前我们已经介绍了在Spring Boot中如何配置和使用MongoDB.LDAP这些存储的案例.接下来,我们继续介绍另一种特殊的数据库:时序数据库InfluxDB在 ...

  2. Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)

    影响版本 Spring WebFlow 2.4.0 - 2.4.4 访问id为1的酒店http:/ :8080/hotels/1,点击预订按钮"Book Hotel",填写相关信息 ...

  3. PHP-FPM 远程代码执行漏洞(CVE-2019-11043)

    影响范围 在 Nginx + PHP-FPM 环境下,当启用了上述 Nginx 配置后,以下 PHP 版本受本次漏洞影响,另外,PHP 5.6版本也受此漏洞影响,但目前只能 Crash,不可以远程代码 ...

  4. GhostScript 沙箱绕过(命令执行)漏洞(CVE-2018-16509)

    影响范围: Ghostscript 9.24之前版本 poc地址 https://github.com/vulhub/vulhub/blob/master/ghostscript/CVE-2018-1 ...

  5. SQL遍历日期

    IF OBJECT_ID(N'tempdb..#temp', N'U') IS NOT NULL BEGIN DROP TABLE #temp;--临时表删除 END --创建临时表 CREATE T ...

  6. 几张图搞懂 NodeJS 的流

    假设我们现在要盖一座房子,我们买了一些砖块,厂家正在送货.现在我们有两个选择,一是等所有砖块都到了以后再开始动工:二是到一批砖块就开始动工,砖块到多少我们就用多少. 这两种方式哪种效率更高呢?显然是第 ...

  7. C++ 读 ,写 文件

    1 //文件操作 2 //文本文件 读 ,写文件 3 4 #include <iostream> 5 #include <string> 6 #include<fstre ...

  8. 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别

    前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...

  9. SQL--查询JSON、时间、字符串的高级用法

    SQL--查询JSON.时间.字符串的高级用法 本文章总结SQL的JSON.时间格式.字符串判断转换的使用.核心点还是在于Json字段的提取(1.5).时间的比较(2.2,2.3)以及字符串的查询(3 ...

  10. zzcms2020代码审计笔记

    在CNVD中看到zzcms后台sql注入漏洞: 漏洞细节未被公开,影响版本zzcms2020,本地搭建一套相同版本找一下漏洞触发点. 打开目录,后台ba***.php文件共有三个: 先看下bad.ph ...