【发布时间】:2017-08-27 10:49:50
【问题描述】:
我正在尝试在三个 numpy 数组之间进行点积。但是,我正在努力解决这个问题。
问题如下:
我分别有两个 (4,) 形状的 numpy 数组 a 和 b,以及一个形状为 (4, 4, 3) 的 numpy 数组 c。
import numpy as np
a = np.array([0, 1, 2, 3])
b = np.array([[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]],
[[2, 2, 2], [2, 2, 2], [2, 2, 2], [2, 2, 2]],
[[3, 3, 3], [3, 3, 3], [3, 3, 3], [3, 3, 3]],
[[4, 4, 4], [4, 4, 4], [4, 4, 4], [4, 4, 4]]])
c = np.array([4, 5, 6, 7])
我想以这样一种方式计算点积,即我的结果是一个 3 元组。也就是说,首先用b 点a,然后用c 点,如果需要,进行转置。换句话说,我想计算a、b 和c 之间的点积,就好像c 的形状为(4, 4),但我想要一个三元组作为结果。
我试过了:
重塑a和c,然后计算点积:
a = np.reshape(a, (4, 1))
c = np.reshape(c, (4, 1))
tmp = np.dot(a.T, b) # now has shape (1, 4, 3)
result = np.dot(tmp, c)
理想情况下,我现在应该:
print(result.shape)
>> (1, 1, 3)
但我得到了错误
ValueError:形状 (1,4,3) 和 (4,1) 未对齐:3 (dim 2) != 4 (dim 0)
我也尝试过使用 numpy 中的 tensordot 函数,但没有运气。
【问题讨论】:
-
你能把结果行拆分成语句吗?更容易看出哪个点积失败了。
-
错误很明显:您正在尝试在不同大小的事物上计算点积。
-
您在寻找这样的东西吗?
np.dot(np.dot(a, b).T, c);结果是array([360, 360, 360]) -
@DavidEhrmann 我知道它们的尺寸不同。我希望 numpy 会自动分布在最后一个轴上。也就是说,如果有意义的话,点积将在两个第一轴上运行。 (1, 4) (4, 1) @kmario23
np.dot(np.dot(a, b).T, c)不起作用,因为a和b都是形状 (1, 4)
标签: python arrays numpy matrix dot-product