Python Numpy中reshape函数参数-1的含义

新数组的shape属性应该要与原来数组的一致,即新数组元素数量与原数组元素数量要相等。一个参数为-1时,那么reshape函数会根据另一个参数的维度计算出数组的另外一个shape属性值。

下面来举几个例子来理解一下:

>>> z = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]])

>>> print(z)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]
>>> print(z.shape)
(4, 4)
>>> print(z.reshape(-1))
[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16]
>>> print(z.reshape(-1,1))  #我们不知道z的shape属性是多少,
                            #但是想让z变成只有一列,行数不知道多少,
                            #通过`z.reshape(-1,1)`,Numpy自动计算出有16行,
                            #新的数组shape属性为(16, 1),与原来的(4, 4)配套。
[[ 1]
 [ 2]
 [ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]
 [11]
 [12]
 [13]
 [14]
 [15]
 [16]]
>>> print(z.reshape(2,-1))
[[ 1  2  3  4  5  6  7  8]
 [ 9 10 11 12 13 14 15 16]]
  •  

关于reshape函数的具体介绍请看numpy.reshape

numpy.reshape(重塑)

给数组一个新的形状而不改变其数据

numpy.reshape(a, newshape, order=’C’)

参数:

a:array_like
    要重新形成的数组。
newshape:int或tuple的整数
    新的形状应该与原始形状兼容。如果是整数,则结果将是该长度的1-D数组。一个形状维度可以是-1。在这种情况下,从数组的长度和其余维度推断该值。
order:{'C','F','A'}可选
    使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。'C'意味着使用C样索引顺序读取/写入元素,最后一个轴索引变化最快,回到第一个轴索引变化最慢。'F'意味着使用Fortran样索引顺序读取/写入元素,第一个索引变化最快,最后一个索引变化最慢。注意,'C'和'F'选项不考虑底层数组的内存布局,而只是参考索引的顺序。'A'意味着在Fortran类索引顺序中读/写元素,如果a 是Fortran 在内存中连续的,否则为C样顺序。
  •  

返回:

reshaped_array:ndarray
    如果可能,这将是一个新的视图对象; 否则,它将是一个副本。注意,不能保证返回数组的内存布局(C-或Fortran-连续)。
  •  

数组切片返回值的不同

如取出倒数第二列 train_array[:,-2:-1]与train_array[:,-2](假如train_array为9行5列)都能取出倒数第二列,但是

train_array[:,-2:-1]返回值为9行1列,train_array[:,-2]返回值看起来为1行9列,单reshape出来的结构为(9,)
print(train_array[:,:-1],train_array[:,-2])
print(train_array[:,-2:-1].shape,train_array[:,-1].shape)

输出结果:

train_array[:,-2].reshape(-1,1)可以将其行列结构变为(9,1)而不是(9,)

猜你喜欢

转载自blog.csdn.net/u013344884/article/details/80791990