Python 如何将3d数组中的一维数组乘以带有numpy的2d矩阵
我想要下面的计算。这个例子中使用的值在实际情况中是可变的Python 如何将3d数组中的一维数组乘以带有numpy的2d矩阵,python,arrays,numpy,Python,Arrays,Numpy,我想要下面的计算。这个例子中使用的值在实际情况中是可变的 A = [[1,1,1],[2,1,1]] B =[[[1,2,3],[2,2,2]],[[1,1,2],[1,1,1]]] result = apply_some_function(A,B) >> result = [[[6,7],[6,8]], [[4,5],[3,4]]] 他们的任何有效方法都可以用numpy满足上述计算。 事实上,我不清楚如何将numpy应用于多维阵列。所以,若你们知
A = [[1,1,1],[2,1,1]]
B =[[[1,2,3],[2,2,2]],[[1,1,2],[1,1,1]]]
result = apply_some_function(A,B)
>> result = [[[6,7],[6,8]],
[[4,5],[3,4]]]
他们的任何有效方法都可以用numpy满足上述计算。
事实上,我不清楚如何将numpy应用于多维阵列。所以,若你们知道有助于理解操纵多维数组规则的文档,我很高兴你们能告诉我。你们可以使用或
这两个函数都计算乘积之和。因此,它们是 矩阵乘法的推广 注意阵列的形状通常是有帮助的。如果我们制作
A
、B
和result
NumPy数组:
A = np.array([[1,1,1],[2,1,1]])
B = np.array([[[1,2,3],[2,2,2]],[[1,1,2],[1,1,1]]])
result = np.array([[[6,7],[6,8]], [[4,5],[3,4]]])
然后
请注意,A
和B
中的长度轴3在result
中消失。这表明,(产品的)总和在A
和B
的最后一个轴上
np.tensordot(B,A,(-1,-1))
中的(-1,-1)
告诉np.tensordot
在A
和B
的最后几个轴上求和
类似地,如果np.einsum('ij,klj->kli',A,B)
中的'ij,klj->kli'
表示如果A
有索引i
和j
,如果B
有索引k
,l
和j
,那么结果应该有索引k
,l
。注意j
索引消失了。j
索引是A
和B
中的最后一个索引。因此,'ij,klj->kli'
告诉np.einsum
对A
和B
的最后一个索引求和
剩下要做的唯一一件事就是找出k
、l
和i
索引的正确顺序。由于result
中的每个轴都具有相同的长度,因此result
的形状不提供任何线索。我通过反复试验找到了正确的顺序。您可以使用或
这两个函数都计算乘积之和。因此,它们是 矩阵乘法的推广 注意阵列的形状通常是有帮助的。如果我们制作
A
、B
和result
NumPy数组:
A = np.array([[1,1,1],[2,1,1]])
B = np.array([[[1,2,3],[2,2,2]],[[1,1,2],[1,1,1]]])
result = np.array([[[6,7],[6,8]], [[4,5],[3,4]]])
然后
请注意,A
和B
中的长度轴3在result
中消失。这表明,(产品的)总和在A
和B
的最后一个轴上
np.tensordot(B,A,(-1,-1))
中的(-1,-1)
告诉np.tensordot
在A
和B
的最后几个轴上求和
类似地,如果np.einsum('ij,klj->kli',A,B)
中的'ij,klj->kli'
表示如果A
有索引i
和j
,如果B
有索引k
,l
和j
,那么结果应该有索引k
,l
。注意j
索引消失了。j
索引是A
和B
中的最后一个索引。因此,'ij,klj->kli'
告诉np.einsum
对A
和B
的最后一个索引求和
剩下要做的唯一一件事就是找出
k
、l
和i
索引的正确顺序。由于result
中的每个轴都具有相同的长度,因此result
的形状不提供任何线索。我通过反复试验找到了正确的顺序。谢谢您的回答。我会比预期更快地解决我的问题。我知道我们可以在使用太多复杂矩阵生成时使用np.einsum。谢谢,让我知道非常有用的说明。我真的很感激。谢谢你的回答。我会比我预期的更快地解决我的问题。我知道我们可以在使用太多复杂矩阵生成时使用np.einsum。谢谢,让我知道非常有用的指导。我真的很感激。
In [6]: A.shape
Out[6]: (2, 3)
In [7]: B.shape
Out[7]: (2, 2, 3)
In [9]: result.shape
Out[9]: (2, 2, 2)