技术想要了解更多,还是得看源码。

参数解释

numpy.reshape(a, newshape, order=‘C’) [source] 以下为源码source的内容

源码中已经解释了很多通俗易懂的例子,只不过阅读起来有点费劲(英文)。后面我会给出相应的中文理解说明

resharper vs2022 设置 reshape怎么用_python

参数列表

  1. a
    需要处理的数组数据,当使用numpy.reshap()的这种方式时,需要传入这个参数,当直接使用ndarray.reshap()时,无需传入这个参数。
  2. newshap
    与其说是新的形状,不如说是新的矩阵维度信息格式。可以传入整数整数数组。新的信息格式要与原来的数组内容数量兼容。
  • 当传入为整数时:数值应该与原数组的元素数量一致。生成新的一维数组,列数为整数个。
  • 当传入为整数数组时:整数数组的所有整数数字的乘积为原数组的元素个数。有一种特殊情况:(-1,10)当数组中有一个数字为-1,那么会将剩余的值将不再遵从我们定义的,而是会从数组的长度和剩余维度推断出来的。【这块我也有点懵,后面可以看例子】
  1. order
    这个参数算是一种转换时的读写规则,搞不懂为什么用order这个词来描述这个功能。order共有三种参数内容CFA,默认为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))

数据结果大概是这样的

resharper vs2022 设置 reshape怎么用_数据结构_02

使用reshap

有两种方式可以进行变换

  • r.reshap(12)
  • np.reshap(r,12)

个人更倾向于第一种,可以凭个人喜好去书写规则

区分order的不同情况
r1=r.reshape((4,3),order='C')

resharper vs2022 设置 reshape怎么用_数组_03

r2=r.reshape((4,3),order='F')

resharper vs2022 设置 reshape怎么用_python_04

r3=r.reshape((4,3),order='A')

这里可以看出order="C"order="A" 得出的结果是一样的

resharper vs2022 设置 reshape怎么用_数组_03


修改一下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')

resharper vs2022 设置 reshape怎么用_数据结构_06

使用整数数组带-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]])
原本以为挺简单的一个东西,查查资料,发现还挺多好玩的。慢慢整理