Numpy学习笔记——数组形状

数组堆叠的stack可能是我无法理解的痛……

改变数组形状

需要注意ndarry.T 转置,ndarray.reshape()数组相同更改尺寸,ndarray.resize()都是生成新的数组开辟新的内存区域,而非直接更改原有数组,而ndarray.shape是更改原有数组。

ar1=np.arange(9)
ar2=np.zeros((2,5),dtype=np.int)
print(ar1)
print(ar2)
print('\n-------')

#T 转置 一位数组转置结果不变
print(ar1.T)
print(ar2.T)
print('\n-------')

#reshape只能变成元素数相同的不同尺寸矩阵
print(ar1.reshape(3,3))#已有数组改变形状
print(np.arange(8).reshape(2,4))#生成数组同时改变形状
print(np.reshape(np.arange(8),(2,4)))
print('\n-------')

#resize 在元素不够时会进行排序来生成新矩阵
print(np.resize(ar1,(3,3)))
print(np.resize(ar1,(3,4)))

#shape也可以用来修改数组
ar=np.arange(30)
ar.shape=2,-1,3#-1表示按照其他维数确定该项
print(ar.shape)
print(ar)
ar.shape=-1,5,6
print(ar.shape)
print(ar)
'''

[0 1 2 3 4 5 6 7 8]
[[0 0 0 0 0]
 [0 0 0 0 0]]

-------
[0 1 2 3 4 5 6 7 8]
[[0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]]

-------
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[0 1 2 3]
 [4 5 6 7]]
[[0 1 2 3]
 [4 5 6 7]]

-------
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[0 1 2 3]
 [4 5 6 7]
 [8 0 1 2]]
(2, 5, 3)
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]
  [ 9 10 11]
  [12 13 14]]

 [[15 16 17]
  [18 19 20]
  [21 22 23]
  [24 25 26]
  [27 28 29]]]
(1, 5, 6)
[[[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13 14 15 16 17]
  [18 19 20 21 22 23]
  [24 25 26 27 28 29]]]
'''
数组复制copy
# 数组的复制
ar1 = np.arange(10)
ar2 = ar1
print(ar2 is ar1)
ar1[2] = 9
print(ar1,ar2)
# ar1和ar2指向同一个值,所以ar1改变,ar2一起改变

ar3 = ar1.copy()
print(ar3 is ar1)
ar1[0] = 9
print(ar1,ar3)
# copy方法生成新数组及其数据的完整拷贝
#copy方法常与切片一起使用,删除原数组后新数组仍被保留
ar4=ar1[:5].copy()
del ar1
print(ar4)
'''
True
[0 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]
False
[9 1 9 3 4 5 6 7 8 9] [0 1 9 3 4 5 6 7 8 9]
[9 1 9 3 4]
'''
数据类型转换 ndarray.astype
ar1=np.arange(3,dtype=float)
ar2=ar1.astype(np.int32)
print(ar1,ar1.dtype)
print(ar2,ar2.dtype)
'''
[0. 1. 2.] float64
[0 1 2] int32
'''
数组堆叠
np.hstack vstack

np.hstack(tup)水平方向堆叠,一维数组和二维数组而言增加数组的列宽,三维数组增加的是第二维数。进行堆叠的两个数组除第二维数,其他维数应相同。如shape(2,3)的数组可以与形状为(2,5)的数组堆叠,但不能与(3,3)堆叠。

##hstack 除第二维数其他维数应相同  叠加第二维数
#一维数组
ar1=np.array([1,2])
ar2=np.array(list('abc'))
print(ar1)
print(ar2)
ar=np.hstack((ar1,ar2))
print(ar,ar.shape)
print('\n------')
# 二维数组
ar1=np.arange(2).reshape(2,1)
ar2=np.random.randint(1,10,size=(2,3))
print(ar1)
print(ar2)
ar=np.hstack((ar1,ar2))
print(ar,ar.shape)
print('\n------')
# 三维数组
a=np.arange(12).reshape((2,2,3))
b=np.random.randint(1,10,size=(2,4,3))
print(a)
print(b)
x=np.hstack((a,b))
print(x)
print(x.shape)
'''

[1 2]
['a' 'b' 'c']
['1' '2' 'a' 'b' 'c'] (5,)

------
[[0]
 [1]]
[[1 3 2]
 [1 8 1]]
[[0 1 3 2]
 [1 1 8 1]] (2, 4)

------
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
[[[3 9 1]
  [5 6 4]
  [5 9 8]
  [8 3 6]]

 [[6 1 1]
  [4 1 5]
  [9 6 8]
  [3 6 6]]]
[[[ 0  1  2]
  [ 3  4  5]
  [ 3  9  1]
  [ 5  6  4]
  [ 5  9  8]
  [ 8  3  6]]

 [[ 6  7  8]
  [ 9 10 11]
  [ 6  1  1]
  [ 4  1  5]
  [ 9  6  8]
  [ 3  6  6]]]
(2, 6, 3)
'''

np.vstack(tup)垂直方向堆叠,对一维数组和二维数组堆叠增加数组的行宽,对三维数组增加第一维数。堆叠的两个数组除第一维数维数均应相同,即二维数组列应相同。

#vstack 除第一维数其他维数应相同  叠加第一维数
#一维数组
ar1=np.array([[1,2,3],[4,5,6]])
ar2=np.array(list('abc'))
print(ar1)
print(ar2)
ar=np.vstack((ar1,ar2))
print(ar,ar.shape)
print('\n------')
# 二维数组
ar1=np.arange(3).reshape(1,3)
ar2=np.random.randint(1,10,size=(2,3))
print(ar1)
print(ar2)
ar=np.vstack((ar1,ar2))
print(ar,ar.shape)
print('\n------')
# 三维数组
a=np.arange(8).reshape((2,2,2))
b=np.random.randint(1,10,size=(1,2,2))
print(a,a.shape)
print(b,b.shape)
x=np.vstack((a,b))
print(x)
print(x.shape)
'''

[[1 2 3]
 [4 5 6]]
['a' 'b' 'c']
[['1' '2' '3']
 ['4' '5' '6']
 ['a' 'b' 'c']] (3, 3)

------
[[0 1 2]]
[[5 1 5]
 [4 9 4]]
[[0 1 2]
 [5 1 5]
 [4 9 4]] (3, 3)

------
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]] (2, 2, 2)
[[[6 9]
  [9 1]]] (1, 2, 2)
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]

 [[6 9]
  [9 1]]]
(3, 2, 2)
'''
stack

这个我看了好多还是懵,大概理解为根据axis参数,在不同的轴上进行堆叠。
np.stack(arrays, axis=0, out=None)

  • 两个数组必须相同shape
  • if axis=0 it will be the first dimension and if axis=-1 it will be the last dimension.
  • If provided, the destination to place the result
#jupyter函数说明中的例子,axis对shape的影响
>>> arrays = [np.random.randn(3, 4) for _ in range(10)]
>>> np.stack(arrays, axis=0).shape
(10, 3, 4)
>>> np.stack(arrays, axis=1).shape
(3, 10, 4)
>>> np.stack(arrays, axis=2).shape
(3, 4, 10)
#对一维数组使用stack
#stack一维数组
a = np.array([1, 2, 3])
b = np.array(['a', 'b', 'c'])
print(a)
print(b)

s0=np.stack((a,b))#默认0axis=0纵向 
s1=np.stack((a,b),axis=1)
#axis0 直接纵向堆在一起,增加行的维数
print('stack axis=0:size %s  shape %s'%(s0.size,s0.shape))
print(s0)
# axis1 横着切开 竖着堆叠,相当于都转置后增加列的维数
print('stack axis=1:size %s  shape %s'%(s1.size,s1.shape))
print(s1)
'''
[1 2 3]
['a' 'b' 'c']
stack axis=0:size 6  shape (2, 3)
[['1' '2' '3']
 ['a' 'b' 'c']]
stack axis=1:size 6  shape (3, 2)
[['1' 'a']
 ['2' 'b']
 ['3' 'c']]
'''
数组拆分

np.hsplit(ary, indices_or_sections)

  • 水平拆分(按行)返回list,在第一维数上拆分,第二参数必须是能均等拆分的值。
  • 可以根据索引返回list,标号从0开始。
    np.vsplit(ary, indices_or_sections)
  • 竖直拆分(按列)返回list,第二维数上拆分,必须能等分
  • 可以通过索引返回list
# 数组拆分
ar=np.random.randint(1,10,size=(4,4))
print(ar)
print('水平(按列)拆分hsplit')
hs=np.hsplit(ar,2)
print(hs,type(hs))#返回list
print('水平拆分hsplit取第一个拆分值')
print(np.hsplit(ar,2)[0])#横向拆分
print('垂直(按行)拆分vsplit')
print(np.vsplit(ar,2))#纵向拆分
'''
[[9 2 7 1]
 [3 8 6 9]
 [6 5 5 4]
 [7 9 8 7]]
水平(按列)拆分hsplit
[array([[9, 2],
       [3, 8],
       [6, 5],
       [7, 9]]), array([[7, 1],
       [6, 9],
       [5, 4],
       [8, 7]])] <class 'list'>
水平拆分hsplit取第一个拆分值
[[9 2]
 [3 8]
 [6 5]
 [7 9]]
垂直(按行)拆分vsplit
[array([[9, 2, 7, 1],
       [3, 8, 6, 9]]), array([[6, 5, 5, 4],
       [7, 9, 8, 7]])]
'''
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值