以None作为索引的Python/Numpy数组

cwtwac6a  于 2023-03-12  发布在  Python
关注(0)|答案(2)|浏览(175)

我现在正在学习Python/Numpy,但是我完全不明白None作为数组中的索引是什么意思,我想计算两个二维数据集x和y之间的欧氏距离,输出应该是包含两个数据集之间欧氏距离的二维数组

x[0] and y[0], x[0] and y[1], x[0] and y[2],..., 
x[1] and y[0], x[1] and y[1], x[1] and y[2], and so on.

解决办法是:np.sqrt(np.sum((x[:, None] - y[None])**2, -1)
但是我不明白x[:, None]y[None]之间的区别?它们是如何被重塑的?我只是无法在脑海中想象它。有人能帮忙吗?

798qvoo8

798qvoo81#

让我们举个简单的例子:

x = np.array([10, 20, 30])
y = np.array([1, 2])

x.shape
# (3,)

y.shape
# (3,)

使用x[:, None]添加额外的维度:

x2 = x[:, None]

x2.shape
# (3, 1)

x2
# array([[10],
#        [20],
#        [30]])

使用y[None]会预先生成一个额外的维度:

y2 = y[None]

y2.shape
# (1, 3)

y2
# array([[1, 2]])

现在,当您对这两个数组执行操作时,将广播这两个数组:

x[:, None] - y[None]

# array([[ 9,  8],
#        [19, 18],
#        [29, 28]])

这相当于:

array([[10, 10],         array([[1, 2],
       [20, 20],    -           [1, 2],
       [30, 30]])               [1, 2]])
mzsu5hc0

mzsu5hc02#

也许您应该尝试.shape并将其打印为:

import numpy as np
x = np.random.random(size=10)

print(x.shape)
print(x[None].shape)
print(x[:,None].shape)
print(x[:,None,None].shape)

输出应为:

>>(10,)
>>(1, 10)
>>(10, 1)
>>(10, 1, 1)

所以一般来说,None在相应的索引上增加了一个维度,而且print(x[None].shape)得到的结果和print(x[None,:].shape)一样。

相关问题