转置一维 NumPy 数组
- 2024-12-27 08:47:00
- admin 原创
- 140
问题描述:
我使用 Python 和 NumPy,在“转置”方面遇到了一些问题:
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
调用a.T
不会转置数组。a
例如,如果是,[[],[]]
则转置正确,但我需要的是的转置[...,...,...]
。
解决方案 1:
它完全按照预期工作。1D数组的转置仍然是1D数组!(如果您习惯使用 matlab,它基本上没有 1D 数组的概念。 Matlab 的“1D”数组是 2D。)
如果您想将一维向量转换为二维数组,然后转置它,只需用 对其进行切片即可np.newaxis
(或者None
,它们是相同的,newaxis
只是更具可读性)。
import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)
不过一般来说,你永远不需要担心这一点。如果你只是出于习惯,添加额外的维度通常不是你想要的。Numpy 在进行各种计算时会自动广播一维数组。当你只想要一个向量时,通常不需要区分行向量和列向量(它们都不是向量。它们都是二维的!)。
解决方案 2:
使用两个括号对而不是一个。这将创建一个可以转置的二维数组,这与使用一个括号对创建的一维数组不同。
import numpy as np
a = np.array([[5, 4]])
a.T
更详尽的例子:
>>> a = [3,6,9]
>>> b = np.array(a)
>>> b.T
array([3, 6, 9]) #Here it didn't transpose because 'a' is 1 dimensional
>>> b = np.array([a])
>>> b.T
array([[3], #Here it did transpose because a is 2 dimensional
[6],
[9]])
使用numpy的shape
方法看看这里发生了什么:
>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)
解决方案 3:
对于一维数组:
a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT
print a
array([[1],
[2],
[3],
[4]])
一旦你理解了 -1 的意思是“根据需要的行数”,我发现这是“转置”数组最易读的方式。如果你的数组是高维的,只需使用a.T
。
解决方案 4:
您可以通过将现有向量包裹在一组额外的方括号中来将其转换为矩阵......
from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix
numpy 也有一个matrix
类(参见数组与矩阵)...
matrix(v).T ## transpose a vector into a matrix
解决方案 5:
numpy 1D 数组——>列/行矩阵:
>>> a=np.array([1,2,4])
>>> a[:, None] # col
array([[1],
[2],
[4]])
>>> a[None, :] # row, or faster `a[None]`
array([[1, 2, 4]])
正如@joe-kington 所说,为了便于阅读,您可以None
用进行替换。np.newaxis
解决方案 6:
要将一维数组“转置”为二维列,可以使用numpy.vstack
:
>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
[2],
[3]])
它也适用于原始列表:
>>> numpy.vstack([1,2,3])
array([[1],
[2],
[3]])
解决方案 7:
而是使用arr[:,None]
创建列向量
解决方案 8:
您只能转置二维数组。您可以使用numpy.matrix
来创建二维数组。这已经晚了三年,但我只是在增加可能的解决方案集:
import numpy as np
m = np.matrix([2, 3])
m.T
解决方案 9:
有一种方法未在答案中描述,但在该方法的文档numpy.ndarray.transpose
中描述:
对于一维数组,这没有影响,因为转置向量只是相同的向量。要将一维数组转换为二维列向量,必须添加额外的维度。np.atleast2d(a).T 可以实现这一点,a[:, np.newaxis] 也可以。
可以这样做:
import numpy as np
a = np.array([5,4])
print(a)
print(np.atleast_2d(a).T)
在我看来这比使用 更好newaxis
。
解决方案 10:
转置函数的作用基本上是交换数组的形状和步幅:
>>> a = np.ones((1,2,3))
>>> a.shape
(1, 2, 3)
>>> a.T.shape
(3, 2, 1)
>>> a.strides
(48, 24, 8)
>>> a.T.strides
(8, 24, 48)
对于 1D numpy 数组(秩为 1 的数组),其形状和步幅为 1 元素元组,无法交换,并且这种 1D 数组的转置会将其原封不动地返回。相反,您可以将“行向量”(形状为 的 numpy 数组(1, n)
)转置为“列向量”(形状为 的 numpy 数组(n, 1)
)。要实现这一点,您必须先将 1D numpy 数组转换为行向量,然后交换形状和步幅(转置)。下面是一个执行此操作的函数:
from numpy.lib.stride_tricks import as_strided
def transpose(a):
a = np.atleast_2d(a)
return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])
例子:
>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> transpose(a)
array([[0],
[1],
[2]])
>>> a = np.arange(1, 7).reshape(2,3)
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> transpose(a)
array([[1, 4],
[2, 5],
[3, 6]])
当然,您不必这样做,因为您有一个 1D 数组,您可以直接(n, 1)
通过a.reshape((-1, 1))
或将其重塑为数组a[:, None]
。我只是想演示如何转置数组。
解决方案 11:
另一个解决方案.... :-)
import numpy as np
a = [1,2,4]
[1, 2, 4]
b = np.array([a]).T
数组([[1],[2],[4]])
解决方案 12:
该函数的名称numpy
是column_stack。
>>>a=np.array([5,4])
>>>np.column_stack(a)
array([[5, 4]])
解决方案 13:
我只是整合了上述帖子,希望它能帮助其他人节省一些时间:
下面的数组有(2, )
维度,它是一个一维数组,
b_new = np.array([2j, 3j])
转置一维数组的方法有两种:
用“np.newaxis”或无切片!
print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)
另一种写法,上面没有T
操作。!
print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)
包装 [ ] 或使用 np.matrix,意味着添加一个新的维度。!
print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)
解决方案 14:
要转置示例中的一维数组(平面数组),可以使用以下np.expand_dims()
函数:
>>> a = np.expand_dims(np.array([5, 4]), axis=1)
array([[5],
[4]])
np.expand_dims()
将为所选轴添加一个维度。在本例中,我们使用axis=1
,它添加了一个列维度,从而有效地转置了原始平面数组。
解决方案 15:
正如上面的一些评论所提到的,一维数组的转置是一维数组,因此转置一维数组的一种方法是将数组转换为矩阵,如下所示:
np.transpose(a.reshape(len(a), 1))
扫码咨询,免费领取项目管理大礼包!