飞道的博客

学习笔记(一)——Numpy(一)

327人阅读  评论(0)

Numpy 介绍

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

NumPy的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005年,Travis Oliphant 在 Numeric中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
包括:

  • 一个强大的 N 维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

基本运算

Ndarray 数据结构

NumPy 最重要的一个特点是其 N 维数组对象 ndarray(张量 Tensor 部分略去,请有兴趣自行研究),它是一系列同类型数据的集合,以 0下标为开始进行集合中元素的索引。ndarray对象是用于存放同类型元素的多维数组。ndarray中的每个元素在内存中都有相同存储大小的区域。


numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数
据类型对应上,其中部分类型对应为 Python 内置的类型。


属性

NumPy 的数组中比较重要 ndarray 对象属性有:


基本操作详解

NumPy 数组属性

1、ndarray.ndim 用于返回数组的维数,等于秩

import numpy as np 
 
a = np.arange(24)  
print ('a的维数:',a.ndim)             # a 现只有一个维度
# 现在调整其大小
b = a.reshape(2,4,3)  # b 现在拥有三个维度
print ('b的维数:',b.ndim)

---------------------------
执行结果:
a的维数: 1
b的维数: 3

2、ndarray.shape 也可以用于调整数组大小

import numpy as np  
 
a = np.array([[1,2,3],[4,5,6]])  
print (a.shape)

---------------------------
执行结果:
(2, 3)
import numpy as np 
 
a = np.array([[1,2,3],[4,5,6]]) 
b = a.reshape(3,2)  
print (b)

----------------------------
执行结果:
[[1 2]
 [3 4]
 [5 6]]

NumPy 创建数组

1、numpy.empty、numpy.zeros、numpy.ones初始化

import numpy as np 
x = np.empty([3,2], dtype = int) 
print (x)

-----------------------
执行结果:
[[1 2]
 [3 4]
 [5 6]]
import numpy as np
 
# 默认为浮点数
x = np.zeros(5) 
print(x)
print('') 
# 设置类型为整数
y = np.zeros((5,), dtype = np.int) 
print(y)
print('') 
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
print(z)

------------------------
执行结果:
[0. 0. 0. 0. 0.]

[0 0 0 0 0]

[[(0, 0) (0, 0)]
 [(0, 0) (0, 0)]]
import numpy as np
 
# 默认为浮点数
x = np.ones(5) 
print(x)
 
# 自定义类型
x = np.ones([2,2], dtype = int)
print(x)

--------------------
执行结果:
[1. 1. 1. 1. 1.]
[[1 1]
 [1 1]]

2、NumPy 从数值范围创建数组

import numpy as np
 
x = np.arange(5)  
print (x)

-----------------
执行结果:
[0 1 2 3 4]
import numpy as np
 
# 设置了 dtype
x = np.arange(5, dtype =  float)  
print (x)

-------------------
执行结果:
[0. 1. 2. 3. 4.]
import numpy as np
a = np.linspace(1,10,10)
print(a)

-------------------
执行结果:
[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]

3、切片

import numpy as np
 
a = np.arange(10)
print(a[2:])

--------------------
执行结果:
[2 3 4 5 6 7 8 9]
import numpy as np
 
a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
print(a[2:5])

--------------------
执行结果:
[2 3 4]
import numpy as np
 
a = np.array([[1,2,3],[3,4,5],[4,5,6]], dtype=float)
print(a)
# 从某个索引处开始切割
print('从数组索引 a[1:] 处开始切割')
print(a[1:])

------------------
执行结果:
[[1. 2. 3.]
 [3. 4. 5.]
 [4. 5. 6.]]
从数组索引 a[1:] 处开始切割
[[3. 4. 5.]
 [4. 5. 6.]]
import numpy as np
 
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print (a[...,1])   # 第2列元素
print (a[1,...])   # 第2行元素
print (a[...,1:])  # 第2列及剩下的所有元素

---------------
执行结果:
[2 4 5]
[3 4 5]
[[2 3]
 [4 5]
 [5 6]]
import numpy as np
 
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b)
print(c)
print(d)

-----------------
执行结果:
[[5 6]
 [8 9]]
[[5 6]
 [8 9]]
[[2 3]
 [5 6]
 [8 9]]

NumPy 广播(Broadcast)

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

import numpy as np 
 
a = np.array([1,2,3,4]) 
b = np.array([10,20,30,40]) 
c = a * b 
print (c)

-----------------
执行结果:
[ 10  40  90 160]

当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。如:

import numpy as np 
 
a = np.array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = np.array([1,2,3])
print(a + b)

------------------
执行结果:
[[ 1  2  3]
 [11 12 13]
 [21 22 23]
 [31 32 33]]

Numpy 数组操作

numpy.reshape 函数可以在不改变数据的条件下修改形状,格式如下: numpy.reshape(arr, newshape, order='C')

import numpy as np
 
a = np.arange(8)
print ('原始数组:')
print (a)
print ('')
b = a.reshape(4,2)
print ('修改后的数组:')
print (b)

-------------------
执行结果:
原始数组:
[0 1 2 3 4 5 6 7]

修改后的数组:
[[0 1]
 [2 3]
 [4 5]
 [6 7]]

numpy.ndarray.flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组,格式如下:

ndarray.flatten(order='C'),order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序。

import numpy as np
 
a = np.arange(8).reshape(2,4)
 
print ('原数组:')
print (a)
print ('')
# 默认按行
 
print ('展开的数组:')
print (a.flatten())
print ('')
 
print ('以 F 风格顺序展开的数组:')
print (a.flatten(order = 'F'))

-------------------
执行结果:
原数组:
[[0 1 2 3]
 [4 5 6 7]]

展开的数组:
[0 1 2 3 4 5 6 7]

以 F 风格顺序展开的数组:
[0 4 1 5 2 6 3 7]
import numpy as np
 
a = np.arange(12).reshape(3,4)
 
print ('原数组:')
print (a)
print ('')
 
print ('转置数组:')
print (a.T)

------------------
执行结果:
原数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

转置数组:
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]

连接数组

numpy.concatenate 函数用于沿指定轴连接相同形状的两个或多个数组

import numpy as np
 
a = np.array([[1,2],[3,4]])
 
print ('第一个数组:')
print (a)
print ('')
b = np.array([[5,6],[7,8]])
 
print ('第二个数组:')
print (b)
print ('')
# 两个数组的维度相同
 
print ('沿轴 0 连接两个数组:')
print (np.concatenate((a,b)))
print ('')
 
print ('沿轴 1 连接两个数组:')
print (np.concatenate((a,b),axis = 1))

----------------
执行结果:
第一个数组:
[[1 2]
 [3 4]]

第二个数组:
[[5 6]
 [7 8]]

沿轴 0 连接两个数组:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

沿轴 1 连接两个数组:
[[1 2 5 6]
 [3 4 7 8]]

numpy.hstack 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组。

import numpy as np
 
a = np.array([[1,2],[3,4]])
 
print ('第一个数组:')
print (a)
print ('')
b = np.array([[5,6],[7,8]])
 
print ('第二个数组:')
print (b)
print ('')
 
print ('水平堆叠:')
c = np.hstack((a,b))
print (c)
print ('')

--------------------------
执行结果;
第一个数组:
[[1 2]
 [3 4]]

第二个数组:
[[5 6]
 [7 8]]

水平堆叠:
[[1 2 5 6]
 [3 4 7 8]]

numpy.vstack 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组。

import numpy as np
 
a = np.array([[1,2],[3,4]])
 
print ('第一个数组:')
print (a)
print ('')
b = np.array([[5,6],[7,8]])
 
print ('第二个数组:')
print (b)
print ('')
 
print ('竖直堆叠:')
c = np.vstack((a,b))
print (c)

----------------------
执行结果:
第一个数组:
[[1 2]
 [3 4]]

第二个数组:
[[5 6]
 [7 8]]

竖直堆叠:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

转载:https://blog.csdn.net/qq_46485161/article/details/115771177
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场