# 修改数组形状
# reshape 不改变数据的条件下修改形状
# flat 数组元素迭代器
# flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
# ravel 返回展开数组
a = np.arange(8)
a=a.reshape(2,4)
for element in a.flat:
print (element)
print (a.flatten())
print (a.ravel())
# 翻转数组
# transpose 对换数组的维度
# ndarray.T 和 self.transpose() 相同
# rollaxis 向后滚动指定的轴
# swapaxes 对换数组的两个轴
a = np.arange(12).reshape(3,4)
print (np.transpose(a))
print (a.T)
b = np.rollaxis(a,2,0) # 将轴 2 滚动到轴 0(宽度到深度)
print (np.swapaxes(a, 2, 0)) #现在交换轴 0(深度方向)到轴 2(宽度方向)
# 修改数组维度
# broadcast 产生模仿广播的对象
# broadcast_to 将数组广播到新形状
# expand_dims 扩展数组的形状
# squeeze 从数组的形状中删除一维条目
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])
b = np.broadcast(x,y) # 对 y 广播 x
np.broadcast_to(a,(4,4)) # 广播到新形状
y = np.expand_dims(x, axis = 0) #升维
y = np.squeeze(x) #降维
# 连接数组
# concatenate 连接沿现有轴的数组序列
# stack 沿着新的轴加入一系列数组。
# hstack 水平堆叠序列中的数组(列方向)
# vstack 竖直堆叠序列中的数组(行方向)
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.concatenate((a,b),axis = 1) #沿轴 1 连接两个数组
print(np.stack((a,b),0)) #沿轴 0 堆叠两个数组
print(np.hstack((a,b))) #水平堆叠
print(np.vstack((a,b))) #垂直堆叠
# 分割数组
# split 将一个数组分割为多个子数组
# hsplit 将一个数组水平分割为多个子数组(按列)
# vsplit 将一个数组垂直分割为多个子数组(按行)
a = np.arange(9)
b = np.split(a,3) #将数组分为三个大小相等的子数组
b = np.split(a,[4,7]) #将数组在一维数组中表明的位置分割,0~3,4~7,8~
a = np.arange(16).reshape(4, 4)
b = np.split(a,2) #默认0轴分割,水平
b = np.split(a,2,1) #默认1轴分割,垂直
b = np.hsplit(harr, 3) #水平分割
b = np.vsplit(a,2) #垂直分割
# 数组元素的添加与删除
# resize 返回指定形状的新数组
# append 将值添加到数组末尾
# insert 沿指定轴将值插入到指定下标之前
# delete 删掉某个轴的子数组,并返回删除后的新数组
# unique 查找数组内的唯一元素
a = np.array([[1,2,3],[4,5,6]])
b = np.resize(a, (3,2))
b = np.append(a, [7,8,9])
b = np.insert(a,3,[11,12]) #未传递 Axis 参数。 在删除之前输入数组会被展开
b = np.delete(a,5))
u = np.unique(a)