Answers:
它的工作完全符合预期。一维数组的转置仍然是一维数组!(如果您习惯使用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将自动广播一维数组。当您只想使用向量时,通常无需区分行向量和列向量(都不是向量。它们都是2D!)。
np.arange
快速制作一维数组。的工作原理完全相同a = np.array([5,4])
。
()
并不表示numpy中的附加尺寸。如果a = np.arange(10)
然后a
被array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
作为由产生a.__repr__()
。a.ndim --> 1
如方括号所示,这是一维(即)向量[]
。在array( ... )
当你要么是没见过print(a)
或a.__str__()
。
np.vstack()
操作更加明确:print np.vstack(a)
。
使用两对括号而不是一对。这将创建一个可以转置的2D数组,这与使用一对括号时创建的1D数组不同。
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)
对于一维数组:
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
。
transpose
和reshape
修改数组的方式将有所不同(生成的图像形状相同,但是元素放置的位置不同)。
要将1d数组“转置”为2d列,可以使用numpy.vstack
:
>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
[2],
[3]])
它也适用于普通列表:
>>> numpy.vstack([1,2,3])
array([[1],
[2],
[3]])
vstack
? np.concatenate([atleast_2d(_m) for _m in tup], 0)
。它将数组拆分为(1,1)数组,并将它们连接起来!在此过程中,它会进行复制,而所有重塑后的视图都会进行复制。
而是arr[:,None]
用来创建列向量
转置
x = [[0 1],
[2 3]]
是
xT = [[0 2],
[1 3]]
好的代码是:
x = array([[0, 1],[2, 3]]);
np.transpose(x)
此链接以获取更多信息:
http://docs.scipy.org/doc/numpy/reference/generation/numpy.transpose.html
我只是合并以上帖子,希望它可以帮助其他人节省一些时间:
下面的数组具有(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)
中的函数名称numpy
为column_stack。
>>>a=np.array([5,4])
>>>np.column_stack(a)
array([[5, 4]])
有一种方法未在答案中描述,但在该方法的文档中进行了描述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)
哪个(imo)比使用更好newaxis
。
基本上,transpose函数的作用是交换数组的形状和步幅:
>>> 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)
如果是一维numpy数组(秩为1的数组),则形状和步幅为1元素元组,并且不能交换,而此类一维数组的转置将使其保持不变。相反,您可以将“行向量”(shape的numpy数组(1, n)
)转置为“列向量”(shape的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]])
当然,您不必这样做,因为您拥有一维数组,您可以(n, 1)
通过a.reshape((-1, 1))
或直接将其整形为数组a[:, None]
。我只是想演示如何转置数组。
到目前为止,我学会了以紧凑且可读的方式对一维数组进行实现的方法:
h = np.array([1,2,3,4,5])
v1 = np.vstack(h)
v2 = np.c_[h]
h1 = np.hstack(v1)
h2 = np.r_[v2[:,0]]
numpy.r_和 numpy.c_分别将切片对象转换为沿第一和第二轴的串联。因此,切片v2 [:,0]将垂直数组v2换回水平数组h2
numpy.vstack等效于形状(N,)的一维数组已重整为(1,N)后沿第一轴的连接。重建除以 vsplit的数组。