技术想要了解更多,还是得看源码。
参数解释
numpy.reshape(a, newshape, order=‘C’) [source] 以下为源码source的内容
源码中已经解释了很多通俗易懂的例子,只不过阅读起来有点费劲(英文)。后面我会给出相应的中文理解说明
参数列表
- a
需要处理的数组数据,当使用numpy.reshap()的这种方式时,需要传入这个参数,当直接使用ndarray.reshap()时,无需传入这个参数。 - newshap
与其说是新的形状,不如说是新的矩阵维度信息格式。可以传入整数或整数数组。新的信息格式要与原来的数组内容数量兼容。
- 当传入为整数时:数值应该与原数组的元素数量一致。生成新的一维数组,列数为整数个。
- 当传入为整数数组时:整数数组的所有整数数字的乘积为原数组的元素个数。有一种特殊情况:(-1,10)当数组中有一个数字为-1,那么会将剩余的值将不再遵从我们定义的,而是会从数组的长度和剩余维度推断出来的。【这块我也有点懵,后面可以看例子】
- order
这个参数算是一种转换时的读写规则,搞不懂为什么用order这个词来描述这个功能。order共有三种参数内容C、F、A,默认为C。(以下解释画删除线的为原文百度翻译的结果)
- order=“C”
意味着使用类似C的索引顺序读/写元素,最后一个轴的索引变化最快,回到第一个轴索引更改最慢。 - order=“F”
表示使用类似Fortran的索引顺序读/写元素,第一个索引变化最快,最后一个索引更改最慢。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序。 - order=“A”
表示如果A在内存中是Fortran连续的,则按类似Fortran的索引顺序读/写元素,否则是C顺序。
注:FORTRAN和C是两个语言,他们存储数组的方式不同,FORTRSAN为列有限,而C为行优先。在python中默认数组生成的时候是按照C的方式进行存储。但,很多时候我们需要调用Fortran的一些库进行数学计算,所以需要让numpy生成的数组变成按照FORTRAN的方式存储,使用numpy.asfortranarray方法,本博客同时给出了它的官方链接。
理解含义
骚操作
事例说明
数据准备
生成一个二维的数组,数据范围0到10,
这里选用的3行4列。这个数据规模是20以内可以被整除最多且元素数量最少的。可以方便变换形状去查看结果。
import numpy as np
from numpy import random as nr
r=nr.randint(0,10,size=(3,4))
数据结果大概是这样的
使用reshap
有两种方式可以进行变换
- r.reshap(12)
- np.reshap(r,12)
个人更倾向于第一种,可以凭个人喜好去书写规则
区分order的不同情况
r1=r.reshape((4,3),order='C')
r2=r.reshape((4,3),order='F')
r3=r.reshape((4,3),order='A')
这里可以看出order="C"
和order="A"
得出的结果是一样的
修改一下r的存储方式,使用类Fortan的格式来进行存储。
r = np.asfortranarray(r)
r1 = r.reshape((4,3),order='C')
r2 = r.reshape((4,3),order='F')
r3 = r.reshape((4,3),order='A')
使用整数数组带-1的情况
r4 = r.reshape((-1,3))
r5 = r.reshape((-1,2))
r6 = r.reshape((-1,1))
print(r4)
array([[8, 7, 1],
[2, 6, 3],
[9, 0, 3],
[2, 4, 2]])
print(r5)
array([[8, 7],
[1, 2],
[6, 3],
[9, 0],
[3, 2],
[4, 2]])
print(r6)
array([[8],
[7],
[1],
[2],
[6],
[3],
[9],
[0],
[3],
[2],
[4],
[2]])
原本以为挺简单的一个东西,查查资料,发现还挺多好玩的。慢慢整理