reshape和resize是Numpy中常用的用于改变数组形状的方法。但是两者在使用的时候还是有很大的区别。
reshape
通过运行reshape我们可以发现,此时的数组a和数组b分别表示两种不同形状的数组。这个时候,我们去修改a中某个元素的值,发现b中对应位置的元素也进行的改变,同样地,我们修改b中的某个元素,发现a中对应位置的元素也进行了相应的改变。
这是因为调用reshape方法返回的数组,除了形状跟原始数组不一样外,所有的元素内容与原始数组共享。由于reshape是将原始数组以不同的形状对外呈现,所以reshape并不具有缩放功能,对参数的要求较为严格,如下图所示,当参数不合法时,会调用失败。reshape的常见用法有:
-
reshape(n,-1)
:生成一个将原数组转化成n行的新数组; -
reshape(-1,n)
:生成一个将原数组转化成n列的新数组;
resize
通过运行resize我们可以发现,调用resize不会返回任何新的数组,而是在原始数组的基础上进行形状改变。resize不仅可以改变原始数组的形状,还能对原始数组进行缩放,即削减原数组元素数量或以指定值增补新元素, 如:
总结一下
- resize方法没有返回值,会改变原数组的形状,甚至是原数组的元素数量(对原始数组进行缩放)。reshape会返回一个形状与原数组形状不同的新数组,但是元素数量一定与原数组相同。
- resize不严格要求维度参数的乘积等于原数组元素的个数,当参数乘积小于原数组的元素个数时,会对原数组的元素进行截断;当参数乘积大于原数组的元素个数是,多出来的元素会自动补零。另外不同于reshape,resize不允许使用负数作为参数。
- reshape对调用参数有着严格的限制,要求每个维度的乘积必须等于原来的元素个数(负数除外,负数参数一般会自动算出,前提是保证其他维度的乘积可以整除原数组的元素个数,否则也会报错)。
- reshape产生的新数组与原始数组公用内存空间,即原始数组中的元素内容改变,新数组中对应位置的元素内容也会相应改变,反之亦然。因为reshape其实就是相当于对原始数组进行了不同的形状改变或者说看原始数据的视角变了,但是元素还是那些元素,前后的数组一起共享原始数组的全部元素。这也是为什么reshape对参数要求比较严格的原因,因为不会新增和去除原始数组的元素。
网友评论