Numpy库学习笔记

菜鸟教程
numpy是python的一个库,提供了处理向量、数组、矩阵的函数工具。

对象

Numpy中对象为ndarray,为N维数组对象,是一系列同类型数据的集合。

构成

  • 一个指向数据的指针
  • 数据类型dtype
  • 表示数组形状的元组shape
  • 跨度元组stride 其中的整数指的是前进到当前维度下一元素需跨过的字节。

创建

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
  • object:数组或嵌套的数列,可以是列表、元组、元组、字典等。
  • dtype:数据类型,可选。
  • copy:是否复制数据,可选。
  • order:创建数组的样式,C为行,F为列,A为任意,可选。
  • subok:默认返回一个与基类类型一致的数组,可选。
  • ndmin:指定生成数组的最小维度,可选。
import numpy as np

# 创建1维数组
a = np.array([1, 2, 3])
print(a) # [1 2 3]

# 创建2维数组
b = np.array([[1, 2], [3, 4]])
print(b) # [[1 2]
          #  [3 4]]
# 最小维度
c= np.array([1, 2, 3], ndmin=2)
print(c) # [[1 2 3]] 和先前不同的是存在一个空维度
# dtype
d = np.array([1, 2, 3], dtype=complex)
print(d) # [1.+0.j 2.+0.j 3.+0.j] # 转换类型为复数

数据类型

bool_
int_ # 默认类型
intc  # 与C类型相同
intp # 与平台无关的指针大小的整数类型 
int8、int16、int32、int64 
uint8、uint16、uint32、uint64 # 无符号整数类型
float_ # float64
float16、float32、float64
complex_ # complex128 复数
complex64、complex128

数据类型对象 dtype

import numpy as np
dt=np.dtype(object, align=False, copy=False) # 创建数据类型对象
print(dt) # object
dt1=np.dtype('i4') # 整型4字节
dt2=np.dtype('<i4') # 小端字节序

创建结构化数据类型

dt=np.dtype([('name', 'S10'), ('age', 'i4')])
print(dt) # [('name', 'S10'), ('age', '<i4')]

内建类型的字符代码:

  • S,a:字符串
  • b:布尔值
  • i:整数
  • u:无符号整数
  • f:浮点数
  • c:复数
  • m:timedelta
  • M:datetime
  • O:Python对象
  • V:原始数据(void)

数组属性

数组的维数就是矩阵的秩(rank)。

ndarray.shape # 数组形状
ndarray.ndim # 数组维数
ndarray.size # 数组元素个数
ndarray.dtype # 数组元素类型
ndarray.itemsize # 数组元素字节大小
ndarray.data # 数组数据指针(存储实际元素的缓冲,通过索引访问元素)
ndarray.flags # 数组信息(内存布局、是否连续、是否只读)
ndarray.real # 数组的实部
ndarray.imag # 数组的虚部

进阶创建数组

numpy.empty(shape, dtype=float, order='C') # 指定形状,数据类型
numpy.zeros(shape, dtype=float, order='C') # 全零数组
numpy.zeros_like(a, dtype=None, order='K', subok=True) # 与a形状相同的全零数组
numpy.ones(shape, dtype=float, order='C') # 全一数组
numpy.ones_like(a, dtype=None, order='K', subok=True) # 与a形状相同的全一数组
numpy.full(shape, fill_value, dtype=None, order='C') # 全指定值数组
numpy.eye(N, M=None, k=0, dtype=float) # 单位阵

从范围创建数组

numpy.arange(start, stop, step, dtype=None) # 等差数组
numpy.linspace(start, stop, num, endpoint=True, retstep=False, dtype=None) # 等间距数组
numpy.logspace(start, stop, num, endpoint=True, base=10.0, dtype=None) # 对数等间距数组

数组转化

将列表元组等转换为ndarray

numpy.asarray(a, dtype=None, order=None) # 转换为ndarray

与np.array区别在于:

  • asarray()不会复制数组,而是直接使用原数据的内存,如果输入数组是ndarray,则会返回原数组。
  • array()会复制数组,即使输入数组是ndarray。

数组操作

切片和索引

切片和索引方式本身可以作为一个对象,需要时引用。

s =slice(2, 5, 2) # 切片对象 (start,stop,step)
a=np.arange(10) # 1维数组0-9
print(a[s]) # [2 4]
b=a[2:5:2] # 等效操作

广播

BoardCast发生在两个数组的形状不相同的计算中。

a=np.array([1, 2, 3])
b=np.array([4, 5, 6],[7, 8, 9])
c=a+b
print(c) # [[5 7 9]
         # [8,10,12]]

迭代

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

import numpy as np
 
a = np.arange(6).reshape(2,3)
print ('原始数组是:')
print (a)
print ('\n')
print ('迭代输出元素:')
for x in np.nditer(a):
    print (x, end=", " )
print ('\n')

nditer包含一个参数op_flags,用于指定迭代的类型。

  • op_flag=readwrite:默认值,表示可以读写元素。
  • op_flag=readonly:只读元素。
  • op_flag=writeonly:只写元素。

迭代也可以应用在广播上,先广播后迭代

修改数组

改变形状

reshape 不改变数据的条件下修改形状
flat 数组元素迭代器
flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel 返回展开数组 C横向 F纵向

对换

transpose 对换数组的维度
ndarray.T 和 self.transpose() 相同
rollaxis 向后滚动指定的轴
swapaxes 对换数组的两个轴

修改维度

broadcast 产生模仿广播的对象
broadcast_to 将数组广播到新形状
expand_dims 扩展数组的形状
squeeze 从数组的形状中删除一维条目

改变元素

resize 返回指定形状的新数组
append 将值添加到数组末尾
insert 沿指定轴将值插入到指定下标之前
delete 删掉某个轴的子数组,并返回删除后的新数组
unique 查找数组内的唯一元素


此方悬停
相册 小说 Ai