内容:
·numpy数组的变形
·numpy数组的级联
·numpy数组的切分
·numpy副本
首先,导入numpy第三方包:
import numpy as np
变形:
# numpy数组的变形:
# 在变形时,变形之前的元素个数=变形之后的元素个数,元素个数在变形前后必须具有统一性
# 得到一个元素个数为20个的numpy数组:
arr = np.random.randint(0, 100, size=(20))
# 输出数组arr
print(arr)
# 对得到的数组arr进行变形,划分条件以元组的形式传入,将其划分成“四行五列”,元素个数保持不变:
print(arr.reshape((4, 5)))
运行结果:
级联:
numpy数组的级联由两种方法,第一种是通过axis的传入参数,来控制级联时横向进行,还是纵向进行的;第二种是numpy方法,直接进行控制。
首先,先定义两个numpy数组:
# numpy数组的级联:
arr_1 = np.random.randint(0, 50, size=(3, 3))
arr_2 = np.random.randint(0, 50, size=(3, 3))
第一种:通过axis控制联接方向
# 通过axis控制联接方向
# axis=0:纵向联接
# axis=1:横向联接
# 不管是纵向联接,还是横向联接,数据都会自己进行维度的变更
print("横向联接:\n", np.concatenate((arr_1, arr_2), axis=1))
print("纵向联接:\n", np.concatenate((arr_1, arr_2), axis=0))
运行结果:
第二种:通过numpy方法直接进行控制:
hstack: 横向联接,传入参数为元组,元组元素个数有且为2
vstack: 横向联接,传入参数为元组,元组元素个数有且为2
# hstack: 横向联接,传入参数为元组,元组元素个数有且为2
print("横向联接:\n", np.hstack((arr_1, arr_2)))
# vstack: 横向联接,传入参数为元组,元组元素个数有且为2
print("纵向联接:\n", np.vstack((arr_1, arr_2)))
运行结果:
切分:
【问】:切分和切片有什么区别?
【答】:切分和切片从本质上讲,都是对一组或者多组数据进行分片处理;在切片时,会按照要求对原数据进行处理,从而得到用户想要的数据,但在这个过程中,不会伤及到原数据;而在切分时,则是直接在原数据上进行操作,不保留原数据。
切分也有三种方法,一种是通过axis的参数来确定是横向切分,还是纵向切分;另一种是通过numpy方法,直接进行操作;最后一种是等价切分。
生成一个6行6列的numpy数组:
arr = np.random.randint(0, 100, size=(6, 6))
print(arr)
第一种:
指定划分,indices_or_sections=[a, b],在划分时,第一块0:a,第二块a:b,第三块b:最后
part_1, part_2, part_3 = np.split(arr, indices_or_sections=[1, 5], axis=0)
print("part_1:下标从0开始\n", part_1)
print("part-2:下标从1开始\n", part_2)
print("part_3:下标从5开始\n", part_3)
运行结果:
第二种:
横向:np.hsplit
纵向:np.vsplit
# 横向切分:
print("横向切分:\n", np.hsplit(arr, indices_or_sections=[1, 5]))
# 纵向切分:
print("纵向切分:\n", np.vsplit(arr, indices_or_sections=[1, 5]))
运行结果:
第三种:
限制条件:被切割数组的第一维度a,必须可以整除被切割的份数b,也就是a%b==0恒成立
part_1, part_2 = np.split(arr, indices_or_sections=2)
print("part_1:\n", part_1)
print("part_2:\n", part_2)
运行结果:
numpy副本:
对一组原始数据进行副本创建,可以保证副本的内存位置和原始数据的内存位置不一致
arr = np.random.randint(0, 100, size=(3, 3))
arr_copy = arr.copy()
print("arr:\n", arr)
print("arr_copy:\n", arr_copy)
运行结果: