reshape:在不更改数据的情况下为数组赋予新的形状。
用法简介
reshape 可以理解为先按照一定的索引顺序处理原先数组的元素,然后使用相同的索引顺序将数组中的元素插入到新数组中。
我们先看一下它的参数介绍:
共传入三个参数:
a
:输入一个需要被改变形状的数组。newshape
:改变形状后的新数组,要与原数组兼容。兼容的意义是指,转变前后元素个数要相同。原先是一个 2 * 3 数组的话,如果输入的是一个整数,它只能是6,这样它会输出一个 1 * 6 的数组;如果是整数组,则二者元素个数相同,例如生成 3 * 2 的数组。order
:读取与放置元素的顺序,有三种可选:- C 表示最后一个维度改变的最快,而最开始的维度改变的最慢。对于二维数组来说,表示先将第一行的每一列元素处理后,才开始处理第二行,因此表示行优先。
- F 刚好相反,表示列优先。C 和 F 不考虑数组的内存布局,仅考虑索引顺序。
- 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]]