Python-numpy(2)数组的操作

数组操作

参考

NumPy 教程 | 菜鸟教程NumPy 教程 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。N..https://www.runoob.com/numpy/numpy-tutorial.html

'''
数组的操作
'''
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]
'''







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值