Numpy 最全矩阵操作扩充维度/修改数组维度

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy 最全矩阵操作扩充维度/修改数组维度相关的知识,希望对你有一定的参考价值。

1. np.broadcast

numpy.broadcast:用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果。

该函数使用两个数组作为输入参数,如下实例:

import numpy as np
 
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])  
 
# 对 y 广播 x
b = np.broadcast(x,y)  
# 它拥有 iterator 属性,基于自身组件的迭代器元组
 
print ('对 y 广播 x:')
r,c = b.iters

>>> list(r)
[1, 1, 1, 2, 2, 2, 3, 3, 3]
>>> list(c)
[4, 5, 6, 4, 5, 6, 4, 5, 6]

# Python3.x 为 next(context) ,Python2.x 为 context.next()
print (next(r), next(c))
print (next(r), next(c))
print ('\\n')
# shape 属性返回广播对象的形状
 
print ('广播对象的形状:')
print (b.shape)
print ('\\n')
# 手动使用 broadcast 将 x 与 y 相加
b = np.broadcast(x,y)
c = np.empty(b.shape)
 
print ('手动使用 broadcast 将 x 与 y 相加:')
print (c.shape)
print ('\\n')
c.flat = [u + v for (u,v) in b]
 
print ('调用 flat 函数:')
print (c)
print ('\\n')
# 获得了和 NumPy 内建的广播支持相同的结果
 
print ('x 与 y 的和:')
print (x + y)

输出结果为:

对 y 广播 x:
1 4
1 5


广播对象的形状:
(3, 3)


手动使用 broadcast 将 x 与 y 相加:
(3, 3)


调用 flat 函数:
[[5. 6. 7.]
 [6. 7. 8.]
 [7. 8. 9.]]


x 与 y 的和:
[[5 6 7]
 [6 7 8]
 [7 8 9]]

2. np.broadcast_to

numpy.broadcast_to 函数将数组广播到新形状。它在原始数组上返回只读视图。 它通常不连续。 如果新形状不符合 NumPy 的广播规则,该函数可能会抛出ValueError。

numpy.broadcast_to(array, shape, subok)

实例:

import numpy as np
 
a = np.arange(4).reshape(1,4)
 
print ('原数组:')
print (a)
print ('\\n')
 
print ('调用 broadcast_to 函数之后:')
print (np.broadcast_to(a,(4,4)))

输出结果:

原数组:
[[0 1 2 3]]


调用 broadcast_to 函数之后:
[[0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]]

3. np.expand_dims

numpy.expand_dims 函数通过在指定位置插入新的轴来扩展数组形状,函数格式如下:

 numpy.expand_dims(arr, axis)

参数说明:

  • arr:输入数组
  • axis:新轴插入的位置

实例

import numpy as np
 
x = np.array(([1,2],[3,4]))
 
print ('数组 x:')
print (x)
print ('\\n')
y = np.expand_dims(x, axis = 0)
 
print ('数组 y:')
print (y)
print ('\\n')
 
print ('数组 x 和 y 的形状:')
print (x.shape, y.shape)
print ('\\n')
# 在位置 1 插入轴
y = np.expand_dims(x, axis = 1)
 
print ('在位置 1 插入轴之后的数组 y:')
print (y)
print ('\\n')
 
print ('x.ndim 和 y.ndim:')
print (x.ndim,y.ndim)
print ('\\n')
 
print ('x.shape 和 y.shape:')
print (x.shape, y.shape)

输出结果:

数组 x:
[[1 2]
 [3 4]]


数组 y:
[[[1 2]
  [3 4]]]


数组 x 和 y 的形状:
(2, 2) (1, 2, 2)


在位置 1 插入轴之后的数组 y:
[[[1 2]]

 [[3 4]]]


x.ndim 和 y.ndim:
2 3


x.shape 和 y.shape:
(2, 2) (2, 1, 2)

矩阵a的shape从(96,96)变成(1000,96,96)

可以使用:

np.expand_dims(a,0).repeat(1000,axis=0)

解释:

  • expand_dims表示增加一个维度,这个维度增加在a的0维度。

  • repeat代表重复的次数,axis代表在哪个维度进行重复。

4. np.squeeze

numpy.squeeze 函数从给定数组的形状中删除一维的条目(降低矩阵维度),函数格式如下:

numpy.squeeze(arr, axis)

参数说明:

  • arr:输入数组
  • axis:整数或整数元组,用于选择形状中一维条目的子集

实例:

import numpy as np
 
x = np.arange(9).reshape(1,3,3)
 
print ('数组 x:')
print (x)
print ('\\n')
y = np.squeeze(x)  默认axis=0
 
print ('数组 y:')
print (y)
print ('\\n')
 
print ('数组 x 和 y 的形状:')
print (x.shape, y.shape)

输出结果:

数组 x:
[[[0 1 2]
  [3 4 5]
  [6 7 8]]]


数组 y:
[[0 1 2]
 [3 4 5]
 [6 7 8]]


数组 x 和 y 的形状:
(1, 3, 3) (3, 3)
"""
    squeeze 函数:从数组的形状中删除单维度条目,即把shape中为1的维度去掉
    用法:numpy.squeeze(a,axis = None)
     1)a表示输入的数组;
     2)axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
     3)axis的取值可为None 或 int 或 tuple of ints, 可选。若axis为空,则删除所有单维度的条目;
     4)返回值:数组
     5) 不会修改原数组;
"""
 
 
import numpy as np
 
print("#" * 40, "原始数据", "#" * 40)
x = np.arange(10).reshape(1, 1, 10, 1)
print(x.shape)
print(x)
 
print("#" * 40, "去掉axis=0这个维度", "#" * 40)
x_squeeze_0 = np.squeeze(x, axis=0)
print(x_squeeze_0.shape, x_squeeze_0)
 
print("#" * 40, "去掉axis=3这个维度", "#" * 40)
x_squeeze_3 = np.squeeze(x, axis=3)
print(x_squeeze_3.shape, x_squeeze_3)
 
print("#" * 40, "去掉axis=0, axis=1这两个维度", "#" * 40)
x_squeeze_0_1 = np.squeeze(x, axis=(0, 1))
print(x_squeeze_0_1.shape, x_squeeze_0_1)
 
print("#" * 40, "去掉所有1维的维度", "#" * 40)
x_squeeze = np.squeeze(x)
print(x_squeeze.shape, x_squeeze)
 
print("#" * 40, "去掉不是1维的维度,抛异常", "#" * 40)
try:
    x_squeeze = np.squeeze(x, axis=2)
    print(x_squeeze.shape, x_squeeze)
except Exception as e:
    print(e)
######################################## 原始数据 ########################################
(1, 1, 10, 1)
[[[[0]
   [1]
   [2]
   [3]
   [4]
   [5]
   [6]
   [7]
   [8]
   [9]]]]
######################################## 去掉axis=0这个维度 ########################################
(1, 10, 1) [[[0]
  [1]
  [2]
  [3]
  [4]
  [5]
  [6]
  [7]
  [8]
  [9]]]
######################################## 去掉axis=3这个维度 ########################################
(1, 1, 10) [[[0 1 2 3 4 5 6 7 8 9]]]
######################################## 去掉axis=0, axis=1这两个维度 ########################################
(10, 1) [[0]
 [1]
 [2]
 [3]
 [4]
 [5]
 [6]
 [7]
 [8]
 [9]]
######################################## 去掉所有1维的维度 ########################################
(10,) [0 1 2 3 4 5 6 7 8 9]
######################################## 去掉不是1维的维度,抛异常 ########################################
cannot select an axis to squeeze out which has size not equal to one

5. np.newaxis

np.newaxis,np.expand_dims扩充矩阵维度:

import numpy as np
 
x = np.arange(8).reshape(2, 4)
print(x.shape)
 
# 添加第0维,输出shape -> (1, 2, 4)
x1 = x[np.newaxis, :]
print(x1.shape)
 
# 添加第1维, 输出shape -> (2, 1, 4)
x2 = np.expand_dims(x, axis=1)
print(x2.shape)

输出结果:

(2, 4)
(1, 2, 4)
(2, 1, 4)

(1)比如我们希望将两个二维数组在一个新的维度上拼接成一个三维数组,我们可以先利用 newaxis 构建出这个维度,然后再使用 concatenate,vstack, hstack 等方法。

a = np.array([[1,2],[3,4]]) 
b = np.array([[5,6],[7,8]]) 
a_ = a[..., np.newaxis] 
b_ = b[..., np.newaxis] 
c = np.concatenate((a_, b_), 2) 

其中:

>>>a[..., np.newaxis]
array([[[1],
        [2]],

       [[3],
        [4]]])
c的数组为:
array([[[1, 5],
 [2, 6]],
 
 [[3, 7],
 [4, 8]]])

注意concatenate vstack hstack 等方法并不能修改数组本身的维度。

(2)假设我们想要在第一维之前插入新维度,可以更简单地写成:

c = np.array([a, b])

c的结果为:

array([[[1, 2],
 [3, 4]],
 
 [[5, 6],
 [7, 8]]])

(3)当然如果觉得 newaxis 麻烦,可以先用上面的方法增加新维度,然后再将其从第一维移至想要的位置:

np.rollaxis(c,0,3) 
array([[[1, 5],
 [2, 6]],
 
 [[3, 7],
 [4, 8]]])

注意np.rollaxis 这个函数设计得极其糟糕,它的第二个参数为需要调整位置的轴,第三个参数为目标位置。如果当前位置等于目标位置,函数不作任何操作,否则当前轴将被调整至紧邻目标位置的前一位置处,np.rollaxis(x,n,n+1) 都是没有实际效果的写法。

6. np.flatten

np.flatten() : 对数组进行降维,返回折叠后的一维数组,原数组不变

In [29]: a.flatten()
Out[29]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

7. np.swapaxes

.swapaxes(ax1,ax2) : 将数组n个维度中两个维度进行调换,不改变原数组

In [27]: a.swapaxes(1,0)
Out[27]:
array([[ 0,  5, 10, 15],
       [ 1,  6, 11, 16],
       [ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 4,  9, 14, 19]])

8. np.reshape/np.resize

  • .reshape(shape) : 不改变数组元素,返回一个shape形状的数组,原数组不变
  • .resize(shape) : 与.reshape()功能一致,但修改原数组
In [22]: a = np.arange(20)
#原数组不变
In [23]: a.reshape([4,5])
Out[23]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

In [24]: a
Out[24]python numpy是啥库

Python——最全的Numpy Pandas库的学习笔记

Python——最全的Numpy Pandas库的学习笔记

关于Numpy 的一些操作

NumPy_1

Python——最全的Numpy Pandas库的学习笔记