NumPy库004数组形状的操作

NumPy库004数组形状的操作

1、reshape和resize

将数组变成其他形状

  • reshape不会修改原数组的形状,而是返回一个新数组

  • resize直接修改原来的数组

import numpy as np

a=np.random.randint(0,10,size=(3,4))
print(a)
'''[[2 5 8 2]
 [0 8 2 6]
 [5 2 0 7]]'''

b=a.reshape((2,6))
print(a)
'''[[2 5 8 2]
 [0 8 2 6]
 [5 2 0 7]]'''

print(b)
'''[[2 5 8 2 0 8]
 [2 6 5 2 0 7]]'''

a.resize((2,6))
print(a)
'''[[2 5 8 2 0 8]
 [2 6 5 2 0 7]]'''

2、flatten和ravel

两个方法都是讲多维数组转换成一维数组,两个方法都不会改变原数组

  • flatten返回的是拷贝,对拷贝进行修改会影响原数组
  • ravel得到的结果进行修改时,会影响原来的数组(类似返回的是一个引用,或者指针)
import numpy as np
a=np.zeros((3,4))

print(a)
'''[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]'''

b=a.flatten()
print(a)
'''[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]'''

b[2:8]=1
print(b)
# [0. 0. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
print(a)
'''[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]'''


c=a.ravel()
print(a)
'''[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]'''
c[2:8]=1
print(c)
# [0. 0. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
print(a)
'''[[0. 0. 1. 1.]
 [1. 1. 1. 1.]
 [0. 0. 0. 0.]]'''

3、不同数组的组合

  • 垂直叠加vstack:列数一样
  • 水平叠加hstack:行数一样
  • concatenate((),axis=):可以手动的指定在某个方向叠加
    • axis=0:垂直
    • axis=1:水平
    • axis=None:先在某个方向上叠加,再转换成一维数组
import numpy as np

#垂直方向叠加,列数相同
a1=np.random.randint(0,10,size=(3,4))
print(a1)
'''[[1 8 2 9]
 [2 8 1 5]
 [9 2 0 9]]'''
a2=np.random.randint(0,10,size=(2,4))
print(a2)
'''
[[5 0 3 3]
 [8 6 9 0]]'''


a3=np.vstack([a1,a2])
print(a3)
'''
[[1 8 2 9]
 [2 8 1 5]
 [9 2 0 9]
 [5 0 3 3]
 [8 6 9 0]]'''
c1=np.concatenate((a1,a2),axis=0)
print(c1)
'''
[[1 8 2 9]
 [2 8 1 5]
 [9 2 0 9]
 [5 0 3 3]
 [8 6 9 0]]'''
print(np.concatenate((a1,a2),axis=None))
# [1 8 2 9 2 8 1 5 9 2 0 9 5 0 3 3 8 6 9 0]



#水平叠加,行数必须相同,否则报错
h1=np.random.randint(0,10,size=(3,4))
print(h1)
'''[[5 4 8 8]
 [3 0 3 0]
 [8 2 8 9]]'''

h2=np.random.randint(0,10,size=(3,1))
print(h2)
'''
[[0]
 [2]
 [5]]'''

h3=np.hstack([h1,h2])#行数不一致会报错
print(h3)
'''
[[5 4 8 8 0]
 [3 0 3 0 2]
 [8 2 8 9 5]]'''
c2=np.concatenate((h1,h2),axis=1)
print(c2)
'''
[[5 4 8 8 0]
 [3 0 3 0 2]
 [8 2 8 9 5]]'''
print(np.concatenate((h1,h2),axis=None))
'''[5 4 8 8 3 0 3 0 8 2 8 9 0 2 5]'''
#concatenate((,),axis=)axis=0是水平方向,axis=1是垂直方向,axis=None:先叠加,再变成一维数组

超过两个也可以哦~

import numpy as np

a1=np.random.randint(0,10,size=(3,4))
print(a1)
'''[[2 4 0 4]
 [6 5 0 1]
 [5 8 1 5]]'''

a3=np.random.randint(0,10,size=(1,4))
print(a3)
# [[6 5 5 3]]

a2=np.random.randint(0,10,size=(2,4))
print(a2)
'''[[9 2 4 0]
 [7 0 9 2]]'''

a4=np.vstack([a1,a2,a3])
print(a4)
'''
[[2 4 0 4]
 [6 5 0 1]
 [5 8 1 5]
 [9 2 4 0]
 [7 0 9 2]
 [6 5 5 3]]'''

c1=np.concatenate((a1,a2,a3),axis=0)
print(c1)
'''
[[2 4 0 4]
 [6 5 0 1]
 [5 8 1 5]
 [9 2 4 0]
 [7 0 9 2]
 [6 5 5 3]]'''

print(np.concatenate((a1,a2,a3),axis=None))
# [2 4 0 4 6 5 0 1 5 8 1 5 9 2 4 0 7 0 9 2 6 5 5 3]

4、数组的切割

  • hsplit (a,x) a:数组,x:平均分成x份(一定是平均分)

    hsplit(a,(1,2)) a:数组, (1,2)在第一列和第二列的位置切一刀

  • vsplit 同上

  • split/array_split(array,切几分或在拿切,axis=) axis=1:水平 axis=0:垂直

import numpy as np
a1=np.random.randint(0,10,size=(4,3))

print(a1)
'''[[6 9 7]
 [7 4 0]
 [3 4 2]
 [2 7 2]]'''

print(np.vsplit(a1,2))#横着切
'''[array([[6, 9, 7],
       [7, 4, 0]]), array([[3, 4, 2],
       [2, 7, 2]])]'''

print(np.vsplit(a1,(1,2)))#横着切
'''[array([[6, 9, 7]]), array([[7, 4, 0]]), array([[3, 4, 2],
       [2, 7, 2]])]
'''

print(np.split(a1,2,axis=0))
'''[array([[6, 9, 7],
       [7, 4, 0]]), array([[3, 4, 2],
       [2, 7, 2]])]
'''
print(np.split(a1,(1,2),axis=0))
'''[array([[6, 9, 7]]), array([[7, 4, 0]]), array([[3, 4, 2],
       [2, 7, 2]])]'''


b1=np.random.randint(0,10,size=(3,6))
print(b1)
'''[[3 6 5 7 4 7]
 [1 1 2 5 2 1]
 [0 2 9 0 9 3]]'''

print(np.hsplit(b1,2))#竖着切
'''[array([[3, 6, 5],
       [1, 1, 2],
       [0, 2, 9]]), array([[7, 4, 7],
       [5, 2, 1],
       [0, 9, 3]])]'''

print(np.hsplit(b1,(1,3,4)))#竖着切
'''[array([[3],
       [1],
       [0]]), array([[6, 5],
       [1, 2],
       [2, 9]]), array([[7],
       [5],
       [0]]), array([[4, 7],
       [2, 1],
       [9, 3]])]
'''
print(np.split(b1,2,axis=1))
'''[array([[3, 6, 5],
       [1, 1, 2],
       [0, 2, 9]]), array([[7, 4, 7],
       [5, 2, 1],
       [0, 9, 3]])]'''

print(np.split(b1,(1,3,4),axis=1))
'''[array([[3],
       [1],
       [0]]), array([[6, 5],
       [1, 2],
       [2, 9]]), array([[7],
       [5],
       [0]]), array([[4, 7],
       [2, 1],
       [9, 3]])]'''

注意:

  • vsplit,axis=0代表垂直的意思,但是是着切
  • hsplit,axis=1着切

5、数组的转置

  • T:返回转置的结果,不改变原来的数组
  • a.transport():返回转置的结果,但是是一个View(引用、指针类似),在对这个结果进行操作时会改变原来的数组。
import numpy as np
a1=np.random.randint(0,10,size=(4,3))
print(a1)
'''[[0 7 1]
 [5 1 8]
 [1 3 7]
 [1 6 4]]'''


#.T
a2=a1.T
print(a2)
'''
[[0 5 1 1]
 [7 1 3 6]
 [1 8 7 4]]'''

a2[0]=99
print(a2)
'''[[99 99 99 99]
 [ 7  1  3  6]
 [ 1  8  7  4]]'''

print(a1)
'''[[99  7  1]
 [99  1  8]
 [99  3  7]
 [99  6  4]]'''


#.transpose()方法
a1=np.random.randint(0,10,size=(3,3))
a3=a1.transpose()

print(a3)
'''[[2 7 8]
 [8 7 0]
 [1 0 8]]'''

a3[0]=99
print(a3)
'''[[99 99 99]
 [ 8  7  0]
 [ 1  0  8]]'''
print(a1)
'''[[99  8  1]
 [99  7  0]
 [99  0  8]]
'''
#这个并没有看出来.T和transpose有啥区别呀,这能了解各自的用法
#。。。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值