鄙人学习笔记,这个笔记以例子为主。
开发工具:Spyder
文章目录
ndarray数组对象的维度操作
视图变维(数据共享)
举例:若a与b共用同一个数据,若把b改了,则a也变了。
相关函数:reshape() 与 ravel()
- 例子1
代码:
import numpy as np
a = np.arange(1, 9)
print('a:', a) # [1 2 3 4 5 6 7 8]
b = a.reshape(2, 4) #视图变维 : 变为2行4列的二维数组
print('b:',b)
c = b.reshape(2, 2, 2) #视图变维 变为2页2行2列的三维数组
print('c:',c)
d = c.ravel() #视图变维 变为1维数组
print('d:',d)
结果:
- 例子2
代码1:
import numpy as np
a = np.arange(1, 10)
print(a, a.shape)
b = a.reshape(3, 3)
print(b, b.shape)
b[0, 0] = 98
print(a, a.shape)
结果1:
代码2:
import numpy as np
a = np.arange(1, 10)
b = a.reshape(3, 3)
b[0, 0] = 98
c = b.ravel()
print('c:', c, c.shape)
print('a:', a, a.shape)
结果2:
复制变维(数据独立)
举例:通过a得到一个b,虽然数据内容是一样的,但却是两份数据,他们的地址不同。
相关函数:flatten()
- 例子
代码:
import numpy as np
a = np.arange(1, 10)
b = a.reshape(3, 3)
b[0, 0] = 98
c = b.flatten()
c[2] = 53
print('c:', c, c.shape)
print('b:', b, b.shape)
print('a:', a, a.shape)
结果:
就地变维
含义:直接改变原数组对象的维度,不返回新数组。
相关函数:shape()与resize()
- 例子
代码:
import numpy as np
a = np.arange(1, 9)
print('a:', a)
a.shape = (2, 4)
print("a", a)
a.resize(2, 2, 2)
print('a:', a)
结果:
ndarray数组切片操作
- 语法
数组对象[起始位置:终止位置:步长]
- 说明
①默认位置步长为1;步长为+时,默认切从首到尾;步长为-时,默认切从尾到首。
②数组对象切片的参数设置与列表切面参数类似
- 例子(还需继续研究)
备注:若为若为[:]或[ : : ]则为复制。
多维数组的切片操作
- 例子1
代码:
import numpy as np
a = np.arange(1, 28)
a.resize(3,3,3)
print('a:', a, '\n')
print('切出第1页:', a[0, :, :], '\n')
print('切出所有页的第2行:', a[:, 1, :], '\n')
print('切出第1页的第3列:',a[0, :, 2])
结果:
- 例子2
代码:
import numpy as np
a = np.arange(1, 28)
a.resize(3,3,3)
print(a[:, :2, :], '\n')
print('--------------')
print(a[:2, :2, :2])
结果:
ndarray数组的掩码操作
掩码是啥?看下面这段代码:
被蓝色矩形框起来的就是掩码。
- 例子1
代码:
import numpy as np
a = np.arange(1, 20)
mask = [a % 3 == 0]
print(mask)
print(a[mask])
结果:
- 例子2
代码:
import numpy as np
a = np.arange(1, 50)
mask = [(a % 3 == 0) & (a % 5 == 0)]
print(mask)
print(a[mask])
结果:
- 例子3(使用掩码把数组中的元素重新排列)
代码:
import numpy as np
a = np.array(['a', 'b', 'c', 'd', 'e'])
mask = [2, 4, 1, 0, 2, 3, 1]
print(a[mask])
结果:
多维数组的组合和拆分
垂直方向操作
相关函数:vstack()与vsplit()
- 例子
代码:
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
print('c:', c)
# 垂直方向完成拆分操作,生成两个数组
d, e = np.vsplit(c, 2)
print('d:', d)
print('e:', e)
结果:
垂直方向拆分是分成上下两份。
水平方向操作
相关函数:hstack()与hsplit()
- 例子
代码:
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 水平方向完成组合操作,生成新数组
c = np.hstack((a, b))
print('c:', c)
# 水平方向完成拆分操作,生成两个数组
d, e = np.hsplit(c, 2)
print('d:', d)
print('e:', e)
结果:
水平方向拆分是分成左右两块。
深度方向操作(3维)
相关函数:dstack()与dsplit()
- 例子
代码:
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 深度方向(3维)完成组合操作,生成新数组
c = np.dstack((a, b))
# 深度方向(3维)完成拆分操作,生成两个数组
d, e = np.dsplit(c, 2)
print('c:', c)
print('d:', d)
print('e:', e)
结果:
长度不等的数组组合
相关函数:pad()
- 例子
代码:
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4])
# 填充b数组使其长度与a相同
# 前补0个元素,后补1个元素,都补上-1
b = np.pad(b, pad_width=(0, 1), mode='constant', constant_values=-1)
print('b:', b)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
print('c:', c)
结果:
多维数组组合与拆分的相关函数
相关函数:concatenate()与split()
相关函数的用法:
np.concatenate((数组a, 数组b), axis=0)
# 通过axis作为关键字参数指定组合的方向,取值如下:
# 若待组合的数组都是二维数组:
# 0: 垂直方向组合
# 1: 水平方向组合
# 若待组合的数组都是三维数组:
# 0: 垂直方向组合
# 1: 水平方向组合
# 2: 深度方向组合
np.split(数组, 要拆分的份数, axis=0)
# 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上
简单的一维数组组合方案
相关函数:row_stack()与column_stack()
- 例子
代码:
import numpy as np
a = np.arange(1,9) #[1, 2, 3, 4, 5, 6, 7, 8]
b = np.arange(9,17) #[9,10,11,12,13,14,15,16]
#把两个数组摞在一起成两行
c = np.row_stack((a, b))
print(c)
#把两个数组组合在一起成两列
d = np.column_stack((a, b))
print(d)
结果:
ndarray类的其他属性
属性 | 含义 |
shape | 维度 |
dtype | 元素类型 |
size | 元素数量 |
ndim | 维数,len(shape) |
itemsize | 元素字节数 |
nbytes | 总字节数 = size * itemsize |
real | 复数数组的实部数组 |
imag | 复数数组的虚部数组 |
T | 数组对象的转置视图 |
flat | 扁平迭代器 |
备注:flat可以拿到数组中的每一个元素组成的迭代器。
- 例子
代码:
import numpy as np
a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],
[4 + 2j, 5 + 5j, 6 + 8j],
[7 + 3j, 8 + 6j, 9 + 9j]])
print(a.shape)
print(a.dtype)
print(a.ndim)
print(a.size)
print(a.itemsize)
print(a.nbytes)
print("-----------")
print(a.real, a.imag, sep='\n')
print("-----------")
print(a.T)
print("-----------")
print([elem for elem in a.flat])
print("-----------")
b = a.tolist()
print(b)
备注:data.tolist()函数为转换成列表。
结果: