数组操作
参考
'''
数组的操作
'''
from numpy import *
import numpy as np
print("------------修改数组形状-------------")
#numpy.reshape(arr, newshape, order='C')
a=np.arange(8)
b=a.reshape(4,2,order='C')#在不改变数据的条件下修改形状
print("a=np.arange(8):\n",a)
print("b=a.reshape(4,2):\n",b)
'''
a=np.arange(8):
[0 1 2 3 4 5 6 7]
b=a.reshape(4,2):
[[0 1]
[2 3]
[4 5]
[6 7]]
'''
a=np.arange(4).reshape(2,2)
print("原始a数组:")
for row_a in a:
print(row_a)
print("迭代后的数组:")
#对数组中每个元素都进行处理,可以使用flat属性
#numpy.ndarray.flat 是一个数组元素迭代器:
for element in a.flat:
print(element)
'''
原始a数组:
[0 1]
[2 3]
迭代后的数组:
0
1
2
3
'''
a=np.arange(8).reshape(2,4)
print("原始数组a:\n",a)
print("按行展开的数组a.flatten(order = 'C'):")
#ndarray.flatten(order='C'),返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
print(a.flatten(order = 'C'))
print("按列展开的数组a.flatten(order = 'F'):")
print(a.flatten(order = 'F'))#
#numpy.ravel(a, order='C')展平的数组元素,顺序通常是"C风格",返回的是数组视图,修改会影响原始数组
print("展平的数组元素,顺序是C风格a.ravel(order = 'C'):")
print(a.ravel(order = 'C'))
print("展平的数组元素,顺序是F风格a.ravel(order = 'F'):")
print(a.ravel(order = 'F'))
#numpy.transpose(arr, axes)函数用于对换数组的维度
print("对换数组的维度np.transpose(a):")
print(np.transpose(a))
#获取特定的值坐标
print("np.where(a>6):\n",np.where(a>4))
#获取特定的值
print("a[where(a>4)]:\n",a[where(a>4)])
#将轴 2 滚动到轴 0(宽度到深度)
b=a.reshape(2,2,2)
c=np.rollaxis(b,2,0)
print("b=a.reshape(2,2,2):\n",b)
print("np.rollaxis(b,2,0)=:\n",c)
# 将轴 2 滚动到轴 1:(宽度到高度)
d=np.rollaxis(b,2,1)
print("np.rollaxis(b,2,1)=:\n",d)
'''
原始数组a:
[[0 1 2 3]
[4 5 6 7]]
按行展开的数组a.flatten(order = 'C'):
[0 1 2 3 4 5 6 7]
按列展开的数组a.flatten(order = 'F'):
[0 4 1 5 2 6 3 7]
展平的数组元素,顺序是C风格a.ravel(order = 'C'):
[0 1 2 3 4 5 6 7]
展平的数组元素,顺序是F风格a.ravel(order = 'F'):
[0 4 1 5 2 6 3 7]
对换数组的维度np.transpose(a):
[[0 4]
[1 5]
[2 6]
[3 7]]
np.where(a>6):
(array([1, 1, 1], dtype=int64), array([1, 2, 3], dtype=int64))
a[where(a>4)]:
[5 6 7]
b=a.reshape(2,2,2):
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
np.rollaxis(b,2,0)=:
[[[0 2]
[4 6]]
[[1 3]
[5 7]]]
np.rollaxis(b,2,1)=:
[[[0 2]
[1 3]]
[[4 6]
[5 7]]]
'''
#交换x,y轴
a=np.arange(12).reshape(3,4)
b=np.swapaxes(a,1,0)
print("a=np.arange(12).reshape(3,4):\n",a)
print("交换x,y轴b=np.swapaxes(a,1,0):\n",b)
'''
a=np.arange(12).reshape(3,4):
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
交换x,y轴b=np.swapaxes(a,1,0):
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
'''
#numpy.broadcast,用于模仿广播的对象,它返回一个对象,
# 该对象封装了将一个数组广播到另一个数组的结果
x=np.array([[1],[2],[3]])
y=np.array([4,5,6])
b=np.broadcast(x,y)
r,c=b.iters
print("x=:\n",x)
print("y=:\n",y)
print("对y广播x,next(r),next(c):")
i=0
while i<9:
print(next(r),next(c))
i+=1
d=np.broadcast(x,y)
c=np.empty(d.shape)
print("np.empty(d.shape).shape:\n",c.shape)
c.flat=[u+v for (u,v) in d]
print("c.flat=[u+v for (u,v) in d]:\n",c)
'''
对y广播x,next(r),next(c):
1 4
1 5
1 6
2 4
2 5
2 6
3 4
3 5
3 6
np.empty(d.shape).shape:
(3, 3)
c.flat=[u+v for (u,v) in d]:
[[5. 6. 7.]
[6. 7. 8.]
[7. 8. 9.]]
'''
#将数组广播到新形状numpy.broadcast_to(array, shape, subok)
a=np.arange(4).reshape(1,4)
b=np.broadcast_to(a,(3,4))#列数要相同
print("np.arange(4).reshape(1,4):\n",a)
print("np.broadcast_to(a,(4,3)):\n",b)
'''
np.arange(4).reshape(1,4):
[[0 1 2 3]]
np.broadcast_to(a,(4,3)):
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
'''
#在指定位置插入新的轴来扩展数组形状numpy.expand_dims(arr, axis)
x = np.array(([1,2],[3,4]))
y = np.expand_dims(x, axis = 0)
print("np.array(([1,2],[3,4])):\n",x)
print("np.expand_dims(x, axis = 0):\n",y)
'''
np.array(([1,2],[3,4])):
[[1 2]
[3 4]]
np.expand_dims(x, axis = 0):
[[[1 2]
[3 4]]]
'''
#从给定数组的形状中删除一维的条目numpy.squeeze(arr, axis)
x=np.arange(9).reshape(1,3,3)
y=np.squeeze(x)
print("np.arange(9).reshape(1,3,3):\n",x)
print("np.squeeze(x):\n",y)
print ("x,y形状")
print (x.shape, y.shape)
'''
np.arange(9).reshape(1,3,3):
[[[0 1 2]
[3 4 5]
[6 7 8]]]
np.squeeze(x):
[[0 1 2]
[3 4 5]
[6 7 8]]
x,y形状
(1, 3, 3) (3, 3)
'''
#沿指定轴连接相同形状的两个或多个数组,numpy.concatenate((a1, a2, ...), axis)
a=np.array([[1,2],[3,4]])
b=np.array([[5,6],[7,8]])
print("延轴0链接np.concatenate((a,b),axis=0):\n",np.concatenate((a,b),axis=0))
print("延轴1链接np.concatenate((a,b),axis=1):\n",np.concatenate((a,b),axis=1))
'''
延轴0链接np.concatenate((a,b),axis=0):
[[1 2]
[3 4]
[5 6]
[7 8]]
延轴1链接np.concatenate((a,b),axis=1):
[[1 2 5 6]
[3 4 7 8]]
'''
#沿新轴连接数组序列numpy.stack(arrays, axis)
a=np.array([[1,2],[3,4]])
b=np.array([[5,6],[7,8]])
print("延轴0堆叠np.stack((a,b),axis=0):\n",np.stack((a,b),axis=0))
print("延轴1堆叠np.stack((a,b),axis=1):\n",np.stack((a,b),axis=1))
'''
延轴0堆叠np.stack((a,b),axis=0):
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
延轴1堆叠np.stack((a,b),axis=1):
[[[1 2]
[5 6]]
[[3 4]
[7 8]]]
'''
#水平-垂直堆叠来生成数组numpy.hstack、vstack
a=np.array([[1,2],[3,4]])
b=np.array([[5,6],[7,8]])
print("水平堆叠np.hstack((a,b)):\n",np.hstack((a,b)))
print("垂直堆叠np.vstack((a,b)):\n",np.vstack((a,b)))
'''
水平堆叠np.hstack((a,b)):
[[1 2 5 6]
[3 4 7 8]]
垂直堆叠np.vstack((a,b)):
[[1 2]
[3 4]
[5 6]
[7 8]]
'''
#分割数组numpy.split(ary, indices_or_sections, axis)
a=np.arange(9)
print("a=:\n",a)
#将数组分为三个大小相等的子数组
b=np.split(a,3,axis=0)
print("np.split(a,3):\n",b)
#将数组在一维数组中表明的位置分割
c=np.split(a,[4,7],axis=0)
print("np.split(a,[4,7]:\n",c)
a=np.arange(16).reshape(4,4)
print("a=:\n",a)
d=np.split(a,2,axis=0)
print("沿水平方向分割d=:\n",d)
e=np.split(a,2,axis=1)
print("沿垂直方向分割e=:\n",e)
'''
a=:
[0 1 2 3 4 5 6 7 8]
np.split(a,3):
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
np.split(a,[4,7]:
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
a=:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
沿水平方向分割d=:
[array([[0, 1, 2, 3],[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11],[12, 13, 14, 15]])]
沿垂直方向分割e=:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]),
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
'''
#增加,插入删除元素
#numpy.append(arr, values, axis=None)在数组的末尾添加值
#numpy.insert(arr, obj, values, axis)在给定索引之前,沿给定轴在输入数组中插入值
#Numpy.delete(arr, obj, axis)
a = np.array([[1,2,3],[4,5,6]])
print("延轴0增加np.append(a,[[7,8,9]],axis=0):\n",np.append(a,[[7,8,9]],axis=0))
print("延轴1增加np.append(a,[[5,5,5],[7,8,9]],axis=1):\n",np.append(a,[[5,5,5],[7,8,9]],axis=1))
print("第一行插入np.insert(a,1,[1],axis=0):\n",np.insert(a,1,[1],axis=0))
print("第二列插入np.insert(a,2,[11,12],axis=1):\n",np.insert(a,2,[11,12],axis=1))
print("删除第二列np.delete(a,1,axis = 1):\n",np.delete(a,1,axis = 1))#删除第二列
'''
延轴0增加np.append(a,[[7,8,9]],axis=0):
[[1 2 3]
[4 5 6]
[7 8 9]]
延轴1增加np.append(a,[[5,5,5],[7,8,9]],axis=1):
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
第一行插入np.insert(a,1,[1],axis=0):
[[1 2 3]
[1 1 1]
[4 5 6]]
第二列插入np.insert(a,2,[11,12],axis=1):
[[ 1 2 11 3]
[ 4 5 12 6]]
删除第二列np.delete(a,1,axis = 1):
[[1 3]
[4 6]]
'''
#去除数组中的重复元素
#umpy.unique(arr, return_index, return_inverse, return_counts)
a = np.array([5,2,6,2,7,5,6,8,2,9])
u,indices,inverse,counts=np.unique(a,
return_index=True,return_inverse=True,return_counts=True)
print("去重和数组u",u)
print("新列表元素在旧列表中的位置indices",indices)
print("旧列表元素在新列表中的位置inverse",inverse)
print("去重数组中的元素在原数组中的出现次数counts",counts)
print("使用下标重构原数组u[inverse]",u[inverse])
'''
去重和数组u [2 5 6 7 8 9]
新列表元素在旧列表中的位置indices [1 0 2 4 7 9]
旧列表元素在新列表中的位置inverse [1 0 2 0 3 1 2 4 0 5]
去重数组中的元素在原数组中的出现次数counts [3 2 2 1 1 1]
使用下标重构原数组u[inverse] [5 2 6 2 7 5 6 8 2 9]
'''