首页 > 编程语言 >python之numpy模块

python之numpy模块

时间:2023-07-02 22:36:55浏览次数:73  
标签:arr 模块 python NumPy print 数组 np numpy

1 NumPy是什么?

NumPy (全称:Numeric Python)是python的第三方模块,主要用于计算、处理一维或多维数组。

Numpy通常与Scipy(Python科学计算库),Matplotlib(Python绘图库),Pandas(Python数据处理)等组合使用,这样可以广泛的代替Matlab的使用。

image-20230630182746638

2 为什么使用NumPy?

Python中没有内置数组(array)类型,只有列表(list),但处理速度很慢,NumPy 旨在提供一个比传统 Python 列表快 50 倍的数组对象。

NumPy与列表的不同点有:

  1. NumPy中数组数据元素类型必须全部相同,而列表中数据类型不必相同,所以在通用性能方面Numpy数组不及Python列表;
  2. 在列表(list)中保存的是数据的存放的地址,例如list1=[1,2,3,'a']需要4个指针和四个数据,增加了存储开销和降低了访问效率。而NumPy的数组是为了精确便捷的处理庞大的类似的数据而产生的,存储效率要比列表快很多;
  3. NumPy数组可以进行四则运算(无需编写循环),它会对数组中的每一个元素对应进行运算;而列表只能使用加号进行拼接,拼接之后会形成一个新的列表;

3 NumPy的基础使用

NumPy 定义了一个 n 维数组对象,简称 ndarray。它也被别名所知 array,ndarray对象的几个常用属性:

ndarray对象的属性 含义
ndarray.ndim 维度数量(轴数)0-D(标量)/1-D/2-D/3-D等
ndarray.shape 数组的形状,一个表示各维度长度的元组(元组的长度为ndim)
ndarray.dtype 维度空间内数据类型的对象
ndarray.size 元素总个数
ndarray.itemsize 数组中每个元素的字节大小,例如:元素为 float64 类型的数组的 itemsize 为8(=64/8)

NumPy dtype(数据类型)如下:

序号 数据类型 python定义的的字符代码 语言描述
1 bool_ b 布尔型数据类型(True 或者 False)
2 int_ 默认整数类型,类似于 C 语言中的 long,取值为 int32 或 int64
3 intc 和 C 语言的 int 类型一样,一般是 int32 或 int 64
4 intp 用于索引的整数类型(类似于 C 的 ssize_t,通常为 int32 或 int64)
5 int8 i1 代表与1字节相同的8位整数。值的范围是-128到127。
6 int16 i2 代表 2 字节(16位)的整数。范围是-32768至32767。
7 int32 i4 代表 4 字节(32位)整数。范围是-2147483648至2147483647。
8 int64 i8 表示 8 字节(64位)整数。范围是-9223372036854775808至9223372036854775807。
9 uint8 u1 代表1字节(8位)无符号整数。
10 uint16 u2 2 字节(16位)无符号整数。
11 uint32 u4 4 字节(32位)的无符号整数。
12 uint64 u8 8 字节(64位)的无符号整数。
13 float_ float64 类型的简写。
14 float16 f2 半精度浮点数,包括:1 个符号位,5 个指数位,10个尾数位。
15 float32 f4 单精度浮点数,包括:1 个符号位,8 个指数位,23个尾数位。
16 float64 f8 双精度浮点数,包括:1 个符号位,11 个指数位,52个尾数位。
17 complex_ 复数类型,与 complex128 类型相同。
18 complex64 c8 表示实部和虚部共享 32 位的复数。
19 complex128 c16 表示实部和虚部共享 64 位的复数。
20 str_ a 表示字符串类型
21 string_ 表示字节串类型

3.1 创建

有几种方法可以创建数组:

1 使用array()函数创建一个NumPy ndarray对象

从常规的python列表或元组中创建数组:

import os
import numpy as np

# 可以将列表、元组或任何类似数组的对象传递给 array() 方法,然后它将被转换为 ndarray
# 函数原型: numpy.array(object, dtype = None, copy = True, order = None,ndmin = 0)
arr = np.array([1, 2, 3, 4, 5])
# arr = np.array((1, 2, 3, 4, 5))

print(arr)
print(type(arr))

print(arr.ndim)
print(arr.shape)
print(arr.dtype)
print(arr.size)

执行结果为:

[1 2 3 4 5]
<class 'numpy.ndarray'>
1
(5,)
int64
5

如下,使用array()函数创建0、1、2、3 维数组

数组可以拥有任意数量的维。

在创建数组时,可以使用 ndmin 参数定义维数,也可以用dtype显式指定数组的类型。

import numpy as np

a = np.array(42)
b = np.array([1, 2, 3, 4, 5])
c = np.array([[1, 2, 3], [4, 5, 6]])
d = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])

# 打印维度
print(a.ndim) 
print(b.ndim) 
print(c.ndim) 
print(d.ndim)

运行结果为:

0
1
2
3

创建数组时,使用 ndmin参数或dtype参数

import numpy as np
# 使用 `ndmin` 参数定义维数
e = np.array( [1, 2, 3, 4], ndmin=2 )
print("ndim is ", e.ndim, "shape is", e.shape) 

# 用dtype显式指定数组的类型
f = np.array( [ [1,2,3,4], [3,4,5,6] ], dtype=complex )
print(f)

运行结果为:

ndim is  2 shape is (1, 4)
# f is:
[[1.+0.j 2.+0.j 3.+0.j 4.+0.j]
 [3.+0.j 4.+0.j 5.+0.j 6.+0.j]]

2 使用zeros/ones/empty等函数创建数组

函数 作用
np.zeros 创建一个由0组成的数组
np.ones 创建一个由1组成的数组
np.empty 函数empty 创建一个数组,其初始内容是随机的,取决于内存的状态
np.arange(start, stop, step) NumPy提供了一个类似于range的函数
np.linspace(start, stop, num) 与Numpy arange类似,只不过可以生成等间隔的数据,其中num表示个数而非step

NumPy提供random模块用来创建随机数组:

函数 作用
np.random.random(size=None) 用于在区间[0,1)中生成均匀分布的随机数或随机数数组,数组大小为size。
np.random.rand(d0, d1, ..., dn) rand函数在区间[0,1)中生成服从均匀分布的随机数或随机数数组。
np.random.randn(d0, d1, ..., dn) randn函数可以生成服从正态分布的随机数或随机数数组
np.random.randint(low, high=None, size=None, dtype=int) randint函数可以生成给定上下限范围的随机数,默认的数据类型是np.int

例子:

import numpy as np

arr = np.ones((2,3,4), dtype=np.int16)                # dtype can also be specified
print(arr)

arr1 = np.arange( 0, 30, 5 )
print(arr1)

arr2 = np.linspace( 0, 30, 5 )
print(arr2)

打印结果为:

# arr的shape为(2,3,4)
[[[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]

 [[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]]

# 以下可以对比了解arange与linspace入参的不同
# arr1
[ 0  5 10 15 20 25]
# arr2
[ 0.   7.5 15.  22.5 30. ]

生成随机数组的例子:

import numpy as np

arr1 = np.random.random((2,3))
print(arr1)

# random.rand 与 random.random功能相同,只是传入参数不同,历史原因
arr2 = np.random.rand(2,3)
print(arr2)

arr3 = np.random.randint(2,10,size = [2,3])
print(arr3)

打印结果为:

# arr1
[[0.00944554 0.20582375 0.78710838]
 [0.14880526 0.41143975 0.04881135]]
# arr2
[[0.56776322 0.69684011 0.39539963]
 [0.46664393 0.7757049  0.02909985]]
# arr3
[[9 3 6]
 [6 3 4]]

3.2 改变形状

常见的需求是改变数组形状、扩充数组维度等

1 reshape方法

常用的是reshape与resize,其稍有差别。

image-20230702161002457

import numpy as np

arr = np.floor(10*np.random.random((3,4)))
print(arr.shape)

# 完全展开为1D,默认按行读取,返回的是view,np.flatten返回一份拷贝
arr1 = arr.ravel()
print(arr1)

# reshape改变形状,元素个数要相等才能转换,返回一个新的数组,原数组不受影响
arr2 = arr.reshape(6,2)
print(arr2)


# resize改变形状,元素个数要相等才能转换,返回None,直接操作原数组
arr3 = arr.resize(2, 6)
print(arr3)
print(arr)

执行log为:

# arr
(3, 4)
# arr1 按行展开
[6. 7. 6. 9. 3. 9. 7. 9. 1. 6. 2. 6.]
# arr2 reshape
[[6. 7.]
 [6. 9.]
 [3. 9.]
 [7. 9.]
 [1. 6.]
 [2. 6.]]
# arr3 resize,返回值为None,直接修改原数组
None
[[6. 7. 6. 9. 3. 9.]
 [7. 9. 1. 6. 2. 6.]]

2 扩充数组维度expand_dims

有时候需要扩充数组维度:

1、np.newaxis扩充矩阵维度

2、np.expand_dims扩充矩阵维度

3、np.squeeze删除矩阵中维度大小为1的维度

import numpy as np
  
x = np.arange(8).reshape(2, 4)
print(x.shape)
print(x)
# 添加第0维,输出shape -> (1, 2, 4)
x1 = x[np.newaxis, :]
print(x1.shape)
print(x1)
# 添加第0维, 输出shape -> (1, 2, 4)
x2 = np.expand_dims(x, axis=0)
print(x2.shape)
print(x2)
# 添加第1维, 输出shape -> (2, 1, 4)
x3 = np.expand_dims(x, axis=1)
print(x3.shape)
print(x3)
# 添加第1维, 输出shape -> (2, 4, 1)
x4 = np.expand_dims(x, axis=2)
print(x4.shape)
print(x4)
# np.squeeze删除矩阵中维度大小为1的维度
x5 = np.squeeze(x4)
print(x5.shape)
print(x5)

输出结果为:

# x
(2, 4)
[[0 1 2 3]
 [4 5 6 7]]
# x1 np.newaxis扩充矩阵维度
(1, 2, 4)
[[[0 1 2 3]
  [4 5 6 7]]]

# x2 np.expand_dims(x, axis=0)
(1, 2, 4)
[[[0 1 2 3]
  [4 5 6 7]]]

# x3 np.expand_dims(x, axis=1)
(2, 1, 4)
[[[0 1 2 3]]

 [[4 5 6 7]]]

# x4 np.expand_dims(x, axis=2)
(2, 4, 1)
[[[0]
  [1]
  [2]
  [3]]

 [[4]
  [5]
  [6]
  [7]]]

# x5 删除矩阵中维度大小为1的维度
(2, 4)
[[0 1 2 3]
 [4 5 6 7]]

3.3 索引与迭代

一维的数组可以进行索引、切片和迭代操作的,就像列表和其他Python序列类型一样。

多维的数组每个轴可以有一个索引,这些索引以逗号分隔的元组给出:

例子:

import numpy as np

b = np.random.randint(2, 100, (5,4))
print(b)
print(b[2,3])

结果为:

[[89 40 10 62]
 [72 33 19 88]
 [54 74 42  9]
 [73 13 86  8]
 [52 28 46 34]]
 
9

NumPy 迭代器对象 numpy.nditer 提供了迭代访问一个或者多个数组元素的方式。

import numpy as np
 
a = np.arange(6).reshape(2,3)
print(a)

# 行优先(默认)
print("order = row")
for x in np.nditer(a, order='C'):
    print (x, end=", " )
print ('\n')

# 列优先
print("order = col")
for x in np.nditer(a, order='F'):
    print (x, end=", " )
print ('\n')

# 或者使用python列表方法访问
print("python list item")
for x in a:
  for y in x:
    print(y, end=", ")
print ('\n')

执行输出为:

# origin
[[0 1 2]
 [3 4 5]]

# 行顺序
order = row
0, 1, 2, 3, 4, 5,

# 列顺序
order = col
0, 3, 1, 4, 2, 5,

# python list方法迭代
python list item
0, 1, 2, 3, 4, 5,

3.4 numpy的基本数学运算

见下表,方便查找

运算 含义
算术运算 做算术运算时,输入数组必须具有相同的形状,或者符合数组的广播规则,才可以执行运算
np.add
np.subtract
np.multiply
np.divide
np.reciprocal 倒数
numpy.power() 幂函数
numpy.mod() 求余函数,与 numpy.remainder() 的作用相同
位运算
np.bitwise_and() 位与
np.bitwise_or() 位或
np.invert() 按位取反
np.left_shift() 左移
np.right_shift() 右移
数学函数
np.sin / np.arcsin sin函数
np.cos / np.arccos cos函数
np.tan / np.arctan tan函数
numpy.around() 将数值四舍五入到指定的小数位上
numpy.floor() 向下取整
numpy.ceil() 向上取整
统计函数
np.amin() 沿指定的轴,查找数组中元素的最小值,并以数组形式返回;
np.amax() 沿指定的轴,查找数组中元素的最大值,并以数组形式返回
np.median() 用于计算 a 数组元素的中位数(中值)
np.mean() 该函数表示沿指定的轴,计算数组中元素的算术平均值(即元素之总和除以元素数量)
np.average() 加权平均值是将数组中各数值乘以相应的权数,然后再对权重值求总和,最后以权重的总和除以总的单位数(即因子个数)
np.var() 方差,在统计学中也称样本方差
np.std() 标准差是方差的算术平方根,用来描述一组数据平均值的分散程度。
线性代数
np.dot 两个数组的点积。
np.vdot 两个向量的点积,与 dot() 函数不同
np.inner() 两个数组的内积。
np.matmul() 两个数组的矩阵积。

参考:

  1. NumPy
  2. 快速入门教程 | NumPy
  3. w3school

标签:arr,模块,python,NumPy,print,数组,np,numpy
From: https://www.cnblogs.com/sureZ-learning/p/17521567.html

相关文章

  • 【Python自制工具软件】批量图片转PDF小工具——PIC2PDF
    楔子大家在工作当中总会冒出各种各样的需求,尤其当面对繁琐的工作时。“如果有那样一款想象中的工具就好了!”可以瞬间解决手头工作的想象中的工具,是否存在呢?当然,然而获得它总是需要我们花费大量的时间去筛选甄别,有的充斥大量广告,有的则需要付出不菲的费用。其实完全可以自己上......
  • Python | 文件处理
    文件的读写文件对象在python中用open()可以创建一个文件对象。open()使用方法:open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)参数说明:file:必需,文件路径(相对或者绝对路径)。mode:可选,文件打开模式(常用)buf......
  • Google Colab:云端的Python编程神器
    GoogleColab,全名GoogleColaboratory,是GoogleResearch团队开发的一款云端编程工具,它允许任何人通过浏览器编写和执行Python代码。Colab尤其适合机器学习、数据分析和教育目的。它是一种托管式Jupyter笔记本服务,用户无需设置,就可以直接使用,同时还能获得GPU等计算资源的免费使用......
  • Python | with关键字详解
    with使用背景对于系统资源如文件、数据库连接、socket而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(释放)该资源。比如Python程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,如果不关闭会出现什么情况呢?极端情况下会出现Toomanyopenfiles......
  • python: multiple inheritance
    多继承"""Mother.py多继承类inheritedAnimalpython(类名)superjava继承可以使用extends和implements这两个关键字来实现继承C++:public类名C#:类名可以重写父类方法edit:geovindu,GeovinDudate:20230702IDE:PyCharm2023.1.2"""importsysimportosi......
  • 【numpy基础】--数组索引
    数组索引是指在numpy数组中引用特定元素的方法。numpy的数组索引又称为fancyindexing,比其他编程语言的索引强大很多。1.选取数据numpy的索引除了像其他语言一样选择一个元素,还可以间隔着选取多个元素,也可以用任意的顺序选取元素。比如一维数组:arr=np.random.randint(0,10......
  • python中globals()的用法
    python中globals()的用法 1.获取所有的全局变量,获取到的内容如下:{'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':<_frozen_importlib_external.SourceFileLoaderobjectat0x7efc4bd1d960>,�......
  • Python入门
    一、逻辑运算符的一些记录#非布尔值的与或运算#当我们对非布尔值进行与或运算时,Python会将其当做布尔值运算,最终会返回原值#与运算的规则#与运算是找False的,如果第一个值是False,则不看第二个值#如果第一个值是False,则直接返回第一个值,否则返回第二个值#或......
  • Python - 编写Unicode 字符串
    Python的字符串字面量支持"\xNN"十六进制字节值转义以及"\uNNNN"和"\UNNNNNNNN"Unicode转义。第一种形式用4位十六进制数编码2字节(16位)位字符码点第二种形式用8位十六进制数编码4字节(32位)码点。十六进制值0xCD和0xE8,是ASCII的7位字符范围之外的两个特殊的声调字符......
  • Python 满足列中任意两个数之和等于目标值,输出这两个数的值和所在列表的索引值
    给定一个列表为nums=[2,7,11,15],目标值target=9,找出列表中任意2数之和等于9的元素以及所在位置思路:双重遍历去一对一的比较判断1nums=[2,7,11,15,1,8,2]2target=93list_new=[]4deffind_num_indx():56foriinrange(len(nums)):......