首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >numpy是如何确定列向量的尺寸的?

numpy是如何确定列向量的尺寸的?
EN

Stack Overflow用户
提问于 2019-10-20 18:38:58
回答 1查看 234关注 0票数 1

我从numpy开始,并试图找出它的数组是如何为列向量工作的。定义如下:

代码语言:javascript
运行
复制
x1 = np.array([3.0, 2.0, 1.0])
x2 = np.array([-2.0, 1.0, 0.0])

打电话

代码语言:javascript
运行
复制
print("inner product x1/x2: ", np.inner(x1, x2))

按预期生成inner product x1/x2: -4.0 --这使我认为numpy假设这个表单的数组是一个列向量,并且作为内部函数的一部分,将其中一个转换成一个标量。然而,我编写了一些代码来测试这个想法,它给出了一些我不明白的结果。

在对如何使用.T指定数组是列向量进行了一些搜索之后,我定义了以下内容:

代码语言:javascript
运行
复制
x = np.array([1, 0]).T
xT = np.array([1, 0])

其中,我希望x是列向量,xT是行向量。但是,调用以下内容:

代码语言:javascript
运行
复制
print(x)
print(x.shape)

print(xT)
print(xT.shape)

产生这种情况:

代码语言:javascript
运行
复制
[1 0]
(2,)
[1 0]
(2,)

这表明这两个数组具有相同的维度,尽管其中一个是另一个的转置。此外,调用np.inner(x,x)np.inner(x,xT)都会产生相同的结果。我是误解了.T函数,还是误解了numpy/线性代数的一些基本特征?我不觉得x& xT应该是相同的向量。

最后,我最初使用.T的原因是试图将列向量定义为x = np.array([[1], [0]]),并调用print(np.inner(x, x))生成以下内容作为内部产品:

代码语言:javascript
运行
复制
[[1 0]
 [0 0]]

这就是你期望看到的外部产品的输出。我是不是误用了这种定义列向量的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-20 19:17:08

查看inner文档:

代码语言:javascript
运行
复制
Ordinary inner product of vectors for 1-D arrays 
...
np.inner(a, b) = sum(a[:]*b[:])

使用示例数组:

代码语言:javascript
运行
复制
In [374]: x1 = np.array([3.0, 2.0, 1.0]) 
     ...: x2 = np.array([-2.0, 1.0, 0.0])                                       
In [375]: x1*x2                                                                 
Out[375]: array([-6.,  2.,  0.])
In [376]: np.sum(x1*x2)                                                         
Out[376]: -4.0
In [377]: np.inner(x1,x2)                                                       
Out[377]: -4.0
In [378]: np.dot(x1,x2)                                                         
Out[378]: -4.0
In [379]: x1@x2                                                                 
Out[379]: -4.0

从wiki到dot/scalar/inner product

https://en.wikipedia.org/wiki/Dot_product

代码语言:javascript
运行
复制
two equal-length sequences of numbers (usually coordinate vectors) and returns a single number

代码语言:javascript
运行
复制
If vectors are identified with row matrices, the dot product can also 
be written as a matrix product

从线性代数世界出发,很容易从矩阵(2d)和向量(1行或1列矩阵)的角度来考虑一切。MATLAB/Octave在这个框架内工作。但是numpy更通用,数组具有0或更多的维度,而不仅仅是2。

np.transpose没有添加维度,它只是改变了现有的维度。因此,x1.T不会改变任何东西。

可以用np.array([[1], [0]])生成列向量,或者:

代码语言:javascript
运行
复制
In [381]: x1                                                                    
Out[381]: array([3., 2., 1.])
In [382]: x1[:,None]                                                            
Out[382]: 
array([[3.],
       [2.],
       [1.]])
In [383]: x1.reshape(3,1)                                                       
Out[383]: 
array([[3.],
       [2.],
       [1.]])

np.inner描述当输入不是1d时会发生什么,比如2d (2,1)形状x。它说它使用np.tensordot,它是矩阵积np.dot的推广。

代码语言:javascript
运行
复制
In [386]: x = np.array([[1],[0]])                                               
In [387]: x                                                                     
Out[387]: 
array([[1],
       [0]])
In [388]: np.inner(x,x)                                                         
Out[388]: 
array([[1, 0],
       [0, 0]])
In [389]: np.dot(x,x.T)                                                         
Out[389]: 
array([[1, 0],
       [0, 0]])
In [390]: x*x.T                                                                 
Out[390]: 
array([[1, 0],
       [0, 0]])

这是(2,1)和(1,2)的元素乘积,产生(2,2)或外积。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58476122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档