为什么用整数索引一个矩阵会产生一个不同于numpy中用一个热向量的点积的形状?

2024-09-27 04:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用numpy.random.uniform初始化的矩阵,如下所示:

W = np.random.uniform(-1, 1, (V,N))

在我的例子中,V = 10000N = 50x是一个正整数

当我把W乘以一个热向量x_vec的维vx1,比如W.T.dot(x_vec),我得到一个形状为(50,1)的列向量。当我试图通过索引W得到相同的向量时,如W[x].TW[x,:].T,我得到了shape(50,)。你知道吗

有人能解释一下为什么这两个表达式返回不同的形状,以及是否有可能用索引方法返回(50,1)矩阵(向量)。形状(50,)的向量是有问题的,因为当我将它与其他矩阵相乘时,它的行为与(50,1)向量不同,但是我想使用索引来加快速度。你知道吗

*如果这个问题应该放在交叉验证而不是堆栈交换的地方,请提前道歉


Tags: 方法numpy表达式np矩阵randomuniform向量
1条回答
网友
1楼 · 发布于 2024-09-27 04:23:41

它们是不同的操作。矩阵(在数学意义上)乘以矩阵给出的矩阵,你的一些矩阵恰好有宽度1。 使用整型标量进行索引会吃掉要索引到的维度。一旦降到一个维度,.T就什么都不做了,因为它没有足够的轴来洗牌。你知道吗

如果您想从(50,)到(50,1)形状,那么这个方法就是用None索引,就像v[:, None]。在您的情况下,至少有两个单行选项:

W[x, :][:, None] # or W[x][:, None]     or
W[x:x+1, :].T    # or W[x:x+1].T

第二行选项通过请求长度为1的子范围来保留W的第一维度。由于@hpaulj指出了这一点,第一个选项可以压缩为一个索引操作,这提供了可以说是最可读的选项:

W[x, :, None]

第一个索引(标量整数x)消耗W的第一个维度,第二个维度(不受:影响)成为第一个维度,None在右侧创建一个新维度。你知道吗

相关问题 更多 >

    热门问题