是否可以使用 einsum 转置所有内容?
Is it possible to use einsum to transpose everything?
好的,我知道如何转置矩阵,例如:
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]])
我发现范式的这种变化有点反美,因为一维向量与二维向量(矩阵)绝不是不同的实体,从数学上讲它们来自同一个家庭,分享很多东西。
我的问题是:是否可以用 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]])
是否可以用一维数组来实现?
提前致谢。
einsum
的基本操作是在所有维度上迭代执行一些产品和。在某些情况下会走捷径,甚至可以返回视图。
但我认为它会抱怨'i->j'或'i->ij'。你不能在右边有左边不存在的索引。
einsum('i,j->ji',A,[1])
或某些变体,可能会起作用。但是会慢很多。
In [19]: np.einsum('i,j->ij',[1,2,3],[1])
Out[19]:
array([[1],
[2],
[3]])
In [30]: %%timeit x=np.arange(1000)
...: y=x[:,None]
1000000 loops, best of 3: 439 ns per loop
In [31]: %%timeit x=np.arange(1000)
...: np.einsum('i,j->ij',x,[1])
100000 loops, best of 3: 15.3 µs per loop
是的,您可以使用 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
如果您正在寻找用于转置一维或二维数组的单一语法,这里有两个选项:
使用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]])
A matrix
是 ndarray
的子 class。它是一个专门的 class,它提供了处理矩阵和向量的良好语法。所有矩阵对象(矩阵和向量)都是二维的——向量被实现为具有单列或单行的二维矩阵:
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
的逐元素乘法。请务必学习
差异 如果你使用
np.matrix
.
顺便说一句,NumPy 为 ndarrays
定义转置的方式有一定的美感。
请记住,ndarray
中的 nd
暗示这些对象可以表示 N
维数组。因此,无论这些对象用于 .T
的什么定义都必须适用于 N
维度。
特别是,.T
颠倒轴的顺序。
在二维中,颠倒轴的顺序与矩阵重合
换位。在一维中,转置什么都不做——反转
order of a single axis returns 同轴。美丽的部分是这个
定义适用于 N 维。
好的,我知道如何转置矩阵,例如:
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]])
我发现范式的这种变化有点反美,因为一维向量与二维向量(矩阵)绝不是不同的实体,从数学上讲它们来自同一个家庭,分享很多东西。
我的问题是:是否可以用 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]])
是否可以用一维数组来实现?
提前致谢。
einsum
的基本操作是在所有维度上迭代执行一些产品和。在某些情况下会走捷径,甚至可以返回视图。
但我认为它会抱怨'i->j'或'i->ij'。你不能在右边有左边不存在的索引。
einsum('i,j->ji',A,[1])
或某些变体,可能会起作用。但是会慢很多。
In [19]: np.einsum('i,j->ij',[1,2,3],[1])
Out[19]:
array([[1],
[2],
[3]])
In [30]: %%timeit x=np.arange(1000)
...: y=x[:,None]
1000000 loops, best of 3: 439 ns per loop
In [31]: %%timeit x=np.arange(1000)
...: np.einsum('i,j->ij',x,[1])
100000 loops, best of 3: 15.3 µs per loop
是的,您可以使用 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
如果您正在寻找用于转置一维或二维数组的单一语法,这里有两个选项:
使用
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]])
A
matrix
是ndarray
的子 class。它是一个专门的 class,它提供了处理矩阵和向量的良好语法。所有矩阵对象(矩阵和向量)都是二维的——向量被实现为具有单列或单行的二维矩阵: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
的逐元素乘法。请务必学习 差异 如果你使用np.matrix
.
顺便说一句,NumPy 为 ndarrays
定义转置的方式有一定的美感。
请记住,ndarray
中的 nd
暗示这些对象可以表示 N
维数组。因此,无论这些对象用于 .T
的什么定义都必须适用于 N
维度。
特别是,.T
颠倒轴的顺序。
在二维中,颠倒轴的顺序与矩阵重合 换位。在一维中,转置什么都不做——反转 order of a single axis returns 同轴。美丽的部分是这个 定义适用于 N 维。