日新月异 PyTorch - numpy 基础: numpy 数组的形状变化(升维,降维,轴变换)
日新月异 PyTorch - numpy 基础: numpy 数组的形状变化(升维,降维,轴变换)
示例如下:
numpy\demo4.py
import numpy as np
# 改变数组的形状(升维,降维)
def sample1():
a = np.arange(8)
print(a) # [0 1 2 3 4 5 6 7]
# reshape() 修改数组的形状(要保证数组的形状的大小不变),按行排序
# 数组 a 的形状的大小是 8,数组 b 的形状的大小是 2 * 4 = 8
b = a.reshape(4,2, order='C')
print(b)
'''
[[0 1]
[2 3]
[4 5]
[6 7]]
'''
# reshape() 修改数组的形状(要保证数组的形状的大小不变),按列排序
# -1 代表自动决定这个轴的大小,因为数组 a 的形状的大小是 8,所以数组 b 的形状的大小也是 8(其第 1 轴的大小为 2,所以其第 0 轴的大小会自动指定为 4)
b = a.reshape(-1,2, order='F')
print(b)
'''
[[0 4]
[1 5]
[2 6]
[3 7]]
'''
# np.resize() 修改数组的形状
# 与 reshape() 不同的是,resize() 可以改变形状的大小,空白部分会用原数据按顺序填充
c = np.resize(a, (4,3))
print(c)
'''
[[0 1 2]
[3 4 5]
[6 7 0]
[1 2 3]]
'''
# flat 可以将多维数组转换为元素的迭代器,其可以迭代出每一个元素
d = [v for v in b.flat]
print(d) # [0, 4, 1, 5, 2, 6, 3, 7]
# flatten() 将多维数组降级为一维数组,按行排序
e = b.flatten(order='C')
print(e) # [0 4 1 5 2 6 3 7]
# flatten() 将多维数组降级为一维数组,按列排序
f = b.flatten(order='F')
print(f) # [0 1 2 3 4 5 6 7]
g = np.array([[1, 2], [3, 4]])
print(g)
'''
[[1 2]
[3 4]]
'''
# np.ravel() 将多维数组降级为一维数组,新数组中的元素通过指针引用原数组中的元素
h = np.ravel(g)
print(h)
'''
[1 2 3 4]
'''
# 因为 np.ravel() 做的是数据指针的复制,而不是数据的复制,所以新数组中的元素的变化会影响原数组,原数组中的元素的变化也会影响新数组
h[0] = 100
print(h)
'''
[100 2 3 4]
'''
print(g)
'''
[[100 2]
[ 3 4]]
'''
# 升维,在指定的位置上添加轴
i = np.expand_dims(g, axis=2)
print(i)
'''
[[[100]
[ 2]]
[[ 3]
[ 4]]]
'''
# 降维,删除指定位置的轴
j = np.squeeze(i, axis=2)
print(j)
'''
[[100 2]
[ 3 4]]
'''
# 改变数组的形状(轴变换)
def sample2():
a = np.arange(6).reshape(2, 3)
print(a)
'''
[[0 1 2]
[3 4 5]]
'''
# 轴对换,即行变列,列变行
b = np.transpose(a)
print(b)
'''
[[0 3]
[1 4]
[2 5]]
'''
# 交换 0 轴和 1 轴
c = np.swapaxes(a, 0, 1)
print(c)
'''
[[0 3]
[1 4]
[2 5]]
'''
# 创建一个三维数组
d = np.zeros((1, 2, 3))
# 交换数组的轴(新轴0用原轴1的数据,新轴1用原轴0的数据,新轴2用原轴2的数据)
print(d.transpose(1, 0, 2).shape)
'''
(2, 1, 3)
'''
if __name__ == '__main__':
# 改变数组的形状(升维,降维)
sample1()
# 改变数组的形状(轴变换)
sample2()