Numpy 如何使用reshape或newaxis来添加维度

Numpy 如何使用reshape或newaxis来添加维度

在Numpy中,有时候需要使用多维数组来存储数据,而我们需要手动添加维度。Numpy中提供了reshape和newaxis两种方式来添加维度。本文将为大家介绍这两种方法的使用以及注意点。

阅读更多:Numpy 教程

reshape方法

reshape方法是将原来的数组变成指定的形状,而不改变其数据元素的总数。假设我们有一个一维数组:x = np.array([1, 2, 3, 4, 5, 6]),现在需要将其变成2行3列的二维数组。可以使用reshape方法,如下所示:

x = np.array([1, 2, 3, 4, 5, 6])
y = x.reshape(2, 3)
print(y)
Python

输出结果为:

[[1 2 3]
 [4 5 6]]
Python

同样的,我们也可以将其变成3维数组。代码如下:

x = np.array([1, 2, 3, 4, 5, 6])
y = x.reshape(1, 2, 3)
print(y)
Python

输出结果为:

[[[1 2 3]
  [4 5 6]]]
Python

需要注意的是,reshape方法返回的是一个新的数组,并不是修改原数组。因此,如果需要修改原数组,可以使用“=”方式赋值,如下所示:

x = np.array([1, 2, 3, 4, 5, 6])
x = x.reshape(2, 3)
print(x)
Python

输出结果为:

[[1 2 3]
 [4 5 6]]
Python

newaxis方法

newaxis方法用于增加数组的维度。比如,我们有一个一维数组:x = np.array([1, 2, 3, 4, 5, 6]),现在需要将其转换成二维数组,并且要求axis=0上增加一个新的维度。可以使用newaxis方法,如下所示:

x = np.array([1, 2, 3, 4, 5, 6])
y = x[newaxis, :]
print(y)
Python

输出结果为:

[[1 2 3 4 5 6]]
Python

上述代码经过newaxis操作后,将一维数组变成了二维数组,且第一维的长度为1。同样的,我们也可以在其他维度上增加新维度。

x = np.array([1, 2, 3, 4, 5, 6])
y = x[:, newaxis]
print(y)
Python

输出结果为:

[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]
Python

需要注意的是,newaxis方法只是视角上的改变,并没有真正增加数据量,因此不会开辟新的存储空间,也不会复制数据。可以通过调用数组的flags属性来查看数据是否是原数据的视图。

x = np.array([1, 2, 3, 4, 5, 6])
y = x[:, newaxis]
print(y.flags)
Python

输出结果为:

  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
Python

reshape和newaxis的区别

从上面的介绍可以看到,reshape和newaxis都可以实现增加维度的功能。但它们的区别在于,reshape是将原来的数组变形成新的形状,返回的是一个新的数组,原数组并不会改变;而newaxis是在原来的数组的基础上,对某一维度进行扩展,返回的是原数组的一个视图。

举个例子,假设我们有一个二维数组x=np.array([[1,2],[3,4]]),现在需要增加一个新的维度。首先我们使用reshape方法:

y = x.reshape(1,2,2)
print(y)
Python

输出结果为:

[[[1 2]
  [3 4]]]
Python

然后我们使用newaxis方法:

y = x[newaxis,:,:]
print(y)
Python

输出结果为:

[[[1 2]
  [3 4]]]
Python

可以看到,两种方法得到的结果是相同的,都是增加了一个新的维度,但是reshape返回的是一个新的数组,而newaxis返回的是原数组的视图。

注意事项

在使用reshape和newaxis方法时,需要注意一些事项。

首先,reshape和newaxis操作需要遵循一定的规则。比如,使用reshape方法时,如果将一维数组转换成二维数组,需要保证原数组的元素个数可以被2整除,否则会出现ValueError异常。

x = np.array([1, 2, 3])
y = x.reshape(2, 2)
print(y)
Python

运行上述代码会报错,提示ValueError: cannot reshape array of size 3 into shape (2,2)。

使用newaxis方法时,需要注意新维度的位置。比如,如果需要添加的新维度是第二个维度,那么不能使用x[newaxis,:]的方式添加,而应该使用x[:,newaxis,:]的方式添加。

x = np.array([[1, 2], [3, 4]])
y = x[newaxis,:]
print(y)
Python

以上代码会将数组x变成一个三维数组,但是第二个维度的长度为1,不是我们所需要的结果。应该改成以下代码:

x = np.array([[1, 2], [3, 4]])
y = x[:,newaxis,:]
print(y)
Python

这样得到的结果才是一个三维数组,且第二个维度的长度为1。

另外,在使用reshape和newaxis方法时,需要记住原数组的数据类型和维度的顺序。比如,如果是将一个uint8类型的一维数组转换成二维数组,需要使用如下代码:

x = np.array([1, 2, 3, 4], dtype=np.uint8)
y = x.reshape(2, 2)
print(y)
Python

如果使用如下代码,会出现TypeError异常:

x = np.array([1, 2, 3, 4], dtype=np.uint8)
y = x.reshape(2, 2).T
print(y)
Python

提示信息为:TypeError: ‘<‘ not supported between instances of ‘int’ and ‘bytes’。

总结

本文介绍了Numpy中使用reshape和newaxis方法添加维度的方式,以及它们的区别和注意事项。在使用时,需要根据实际情况选择合适的方法,并遵守相关规则。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册