好的,我知道如何转置矩阵,例如:
A = np.arange(25).reshape(5, 5)
print A
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
A.T
array([[ 0, 5, 10, 15, 20],
[ 1, 6, 11, 16, 21],
[ 2, 7, 12, 17, 22],
[ 3, 8, 13, 18, 23],
[ 4, 9, 14, 19, 24]])
对于一维数组,它不可能使用这个" .T"工具(我不知道为什么,老实说)所以要转换你必须改变范例和使用的矢量,例如:
B = np.arange(5)
print B
array([0, 1, 2, 3, 4])
并且因为B.T
会得到相同的结果,我们应用这种范式更改,使用:
B[ :, np.newaxis]
array([[0],
[1],
[2],
[3],
[4]])
我发现这种范式的变化有点反感,因为1-D向量绝不是与2-D向量(矩阵)不同的实体,从数学上讲它们来自同一个家族并分享很多东西。
我的问题是:是否有可能以一种更为紧凑和统一的方式对待各种张量,以(有时被称为)numpy王冠(即einsum)的宝石进行这种转换?我知道你做的矩阵
np.einsum('ij->ji', A)
你得到的是A.T
:
array([[ 0, 5, 10, 15, 20],
[ 1, 6, 11, 16, 21],
[ 2, 7, 12, 17, 22],
[ 3, 8, 13, 18, 23],
[ 4, 9, 14, 19, 24]])
是否可以使用1-D阵列?
提前谢谢。
答案 0 :(得分:4)
是的,您可以使用einsum
In [17]: B = np.arange(5)
In [35]: np.einsum('i,j->ji', np.ones(1), B)
Out[35]:
array([[ 0.],
[ 1.],
[ 2.],
[ 3.],
[ 4.]])
但这并不是einsum
的真正含义,因为einsum
正在计算产品总和。正如您所料,它比简单地添加新轴要慢。
In [36]: %timeit np.einsum('i,j->ji', np.ones(1), B)
100000 loops, best of 3: 5.43 µs per loop
In [37]: %timeit B[:, None]
1000000 loops, best of 3: 230 ns per loop
如果您正在寻找转换1D或2D阵列的单一语法,这里有两个选项:
使用np.atleast_2d(b).T
:
In [39]: np.atleast_2d(b).T
Out[39]:
array([[0],
[1],
[2],
[3],
[4]])
In [40]: A = np.arange(25).reshape(5,5)
In [41]: np.atleast_2d(A).T
Out[41]:
array([[ 0, 5, 10, 15, 20],
[ 1, 6, 11, 16, 21],
[ 2, 7, 12, 17, 22],
[ 3, 8, 13, 18, 23],
[ 4, 9, 14, 19, 24]])
使用np.matrix
:
In [44]: np.matrix(B).T
Out[44]:
matrix([[0],
[1],
[2],
[3],
[4]])
In [45]: np.matrix(A).T
Out[45]:
matrix([[ 0, 5, 10, 15, 20],
[ 1, 6, 11, 16, 21],
[ 2, 7, 12, 17, 22],
[ 3, 8, 13, 18, 23],
[ 4, 9, 14, 19, 24]])
matrix
是ndarray
的子类。它是一个专门的类,为处理矩阵和向量提供了很好的语法。所有矩阵对象(矩阵和向量)都是二维的 - 向量实现为具有单列或单行的2D矩阵:
In [47]: np.matrix(B).shape # one row
Out[47]: (1, 5)
In [48]: np.matrix(B).T.shape # one column
Out[48]: (5, 1)
matrix
和ndarrays
之间存在其他差异。 *
运算符计算matrix
s的矩阵乘法,但执行
ndarrays
的逐元素乘法。如果您使用,请务必study the
differences
np.matrix
。
顺便说一下,NumPy为ndarrays
定义转置的方式有一定的美感。
请记住,nd
中的ndarray
暗示这些对象可以表示N
- 维数组。因此,这些对象用于.T
的定义必须适用于N
维度。
特别是,.T
会反转轴的顺序。
在2维中,反转轴的顺序与矩阵一致 换位。在一维中,转置什么都不做 - 扭转了 单轴的顺序返回相同的轴。美丽的部分就是这个 定义适用于N维。
答案 1 :(得分:0)
$new_value_to_be_stored = $name1 .",". $name2 .",". $name3;
的基本操作是迭代执行某些产品总和的所有维度。在少数情况下,它会采取捷径,如果可以,甚至会返回观点。
但我认为它会抱怨' i-> j'或者' i-> ij'。你不能在左边已经存在的权利指数。
einsum
或某些变体可能有用。但它会慢很多。
einsum('i,j->ji',A,[1])