『Tips』numpy reshape的用法

reshape:在不更改数据的情况下为数组赋予新的形状。


用法简介

reshape 可以理解为先按照一定的索引顺序处理原先数组的元素,然后使用相同的索引顺序将数组中的元素插入到新数组中。

我们先看一下它的参数介绍:
在这里插入图片描述
共传入三个参数:

  • a:输入一个需要被改变形状的数组。
  • newshape:改变形状后的新数组,要与原数组兼容。兼容的意义是指,转变前后元素个数要相同。原先是一个 2 * 3 数组的话,如果输入的是一个整数,它只能是6,这样它会输出一个 1 * 6 的数组;如果是整数组,则二者元素个数相同,例如生成 3 * 2 的数组。
  • order:读取与放置元素的顺序,有三种可选:
    • C 表示最后一个维度改变的最快,而最开始的维度改变的最慢。对于二维数组来说,表示先将第一行的每一列元素处理后,才开始处理第二行,因此表示行优先。
    • F 刚好相反,表示列优先。CF 不考虑数组的内存布局,仅考虑索引顺序。
    • A 表示遵从a 数组的索引顺序。

因此,若要将数组a转换为 6*1 的数组b,写法为b = numpy.reshape(a, (6, 1), order='C'),也可直接写为b = a.reshape((6, 1), order='C')


用法实战

先简单体验一下:

import numpy as np

>>> a = np.zeros((2, 3), dtype=np.int)
>>> a
[[0 0 0]
 [0 0 0]]
 
>>> b = a.reshape(6)
>>> b
[0 0 0 0 0 0]

>>> b = a.reshape(5)
>>> b
ValueError: cannot reshape array of size 6 into shape (5,)

>>> b = a.reshape((3, 2))
>>> b
[[0 0]
 [0 0]
 [0 0]]

再尝试一下 order 的用法:

>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a
[[1 2 3]
 [4 5 6]]

>>> b = a.reshape((3, 2), order='C')
>>> b
[[1 2]
 [3 4]
 [5 6]]
# 我们发现是按照行读,按照行放

>>> b = a.reshape((3, 2), order='F')
>>> b
[[1 5]
 [4 3]
 [2 6]]
# 我们发现是按照列读,按照列放

最后看看常见的 -1,Numpy会根据剩下的维度计算出数组的另外一个shape属性值。reshape(-1, n)可以将未知行数的数组转换成n列,reshape(n, -1)可以将未知列数的数组转换成n行。

>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a
[[1 2 3]
 [4 5 6]]

>>> b = a.reshape(-1)
>>> b
[1 2 3 4 5 6]

>>> b = a.reshape(-1, 1)
>>> b
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]

>>> b = a.reshape(-1, 2)
>>> b
[[1 2]
 [3 4]
 [5 6]]
 
>>> b = a.reshape(1, -1)
>>> b
[[1 2 3 4 5 6]]

>>> b = a.reshape(2, -1)
>>> b
[[1 2 3]
 [4 5 6]]

参考文章

numpy中reshape方法详解

发布了10 篇原创文章 · 获赞 2 · 访问量 3111

猜你喜欢

转载自blog.csdn.net/qq_42491242/article/details/105327575