当前位置: 首页 > 知识库问答 >
问题:

numpy:为什么(x,1)和(x,)维度有差异

孔俊友
2023-03-14

我想知道为什么numpy中有一维的维度数组(length,1),也有一维的维数组(lendth,),没有第二个值。

我经常遇到这种情况,例如在使用< code>np.concatenate()时,这需要预先执行< code>reshape步骤(或者我可以直接使用< code > h stack /< code > v stack )。

我想不出这种行为可取的理由。有人能解释一下吗?

编辑:< br >其中一条评论暗示我的问题可能是重复的。我更感兴趣的是Numpy的底层工作逻辑,而不是1d和2d数组之间的区别,我认为这是提到的主题的要点。

共有2个答案

狄宇
2023-03-14

其中很大一部分是语法问题。这个元组(x)根本不是元组(只是一个冗余)<然而,code>(x,)是。

(x,) 和 (x,1) 之间的差异甚至更进一步。您可以查看以前此类问题的示例。引用其中的例子,这是一个1Dnumpy数组:

>>> np.array([1, 2, 3]).shape
(3,)

但这个是2D的:

>>> np.array([[1, 2, 3]]).shape
(1, 3)

除非需要,否则重塑不会复制,所以使用起来应该是安全的。

云卓
2023-03-14

ndarray的数据存储为1d缓冲区-只是一个内存块。数组的多维特性由形状strides属性以及使用它们的代码生成。

numpy 开发人员选择允许任意数量的维度,因此形状和步幅表示为任意长度的元组,包括 0 和 1。

相比之下,MATLAB是围绕为矩阵运算开发的FORTRAN程序构建的。在早期,MATLAB中的一切都是二维矩阵。在2000年(3.5版)左右,它被推广到允许多于2d,但从不少于2d。< code > numpy < code > NP . matrix 仍然遵循旧的2d MATLAB约束。

如果你来自MATLAB世界,你会习惯这两个维度,以及行向量和列向量之间的区别。但是在不受MATLAB影响的数学和物理中,向量是一个1d数组。Python列表本质上是1d的,c数组也是如此。要获得2d,你必须有列表列表列表或指向数组的指针数组,具有x[1][2]风格的索引

看看这个数组及其变体的形状和步幅:

In [48]: x=np.arange(10)

In [49]: x.shape
Out[49]: (10,)

In [50]: x.strides
Out[50]: (4,)

In [51]: x1=x.reshape(10,1)

In [52]: x1.shape
Out[52]: (10, 1)

In [53]: x1.strides
Out[53]: (4, 4)

In [54]: x2=np.concatenate((x1,x1),axis=1)

In [55]: x2.shape
Out[55]: (10, 2)

In [56]: x2.strides
Out[56]: (8, 4)

MATLAB在最后增加了新的维度。它像一个< code>order='F'数组一样对其值进行排序,并且可以很容易地将(n,1)矩阵变成(n,1,1,1)。< code>numpy是默认的< code>order='C',可以在开始时扩展数组维数。在利用广播时,理解这一点至关重要。

因此,x1 x是a(10,1)(10,)=

因为广播,数组更像是(1,n)而不是(n,1)。一维数组更像是行矩阵而不是列矩阵。

In [64]: np.matrix(x)
Out[64]: matrix([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

In [65]: _.shape
Out[65]: (1, 10)

concatenate的重点是它需要匹配维度。它不使用广播来调整维度。有一堆堆栈函数可以缓解这种约束,但它们是通过在使用concatenate之前调整维度来实现的。看看他们的代码(可读的Python)。

因此,熟练的numpy用户需要熟悉通用的形状元组,包括空的()(0d数组)、(n,)1d和更高版本。对于更高级的东西,理解步幅也有所帮助(例如,查看转置的步幅和形状)。

 类似资料:
  • 我对Numpy中和之间的区别感到困惑。 例如,我有一个二维数组 当我尝试打印和时,它们都给了我相同的输出: 但是,当我试图通过添加一个维度来广播它时 他们给了我不同的结果。 我试图找出区别,但不能。

  • 问题内容: 我的教授最近说,尽管并且显然会给出相同的结果,但是在JVM中实现它们的方式有所不同。这是什么意思?编译器是否不像:嘿,我明白了,所以我将其切换到并继续吗? 我怀疑在效率方面是否存在差异,但是如果在这些情况下组装会有所不同,我将感到惊讶… 问题答案: 我的教授最近说,尽管x = x + 1和x ++显然会给出相同的结果 我想你的教授也许是故意 的-after 和will 的价值是相同的

  • 在2006年的模糊C代码竞赛中。请解释sykes2。c 有一个语句“

  • 我对此好奇已有一段时间了。我可以忍受,但如果没有足够的注意,它总是会咬我,所以我决定把它贴在这里。假设以下示例(Numpy版本=1.8.2): 我不知道别人怎么想,但我觉得结果不一致。最后一行是列向量,而倒数第二行是行向量,它们应该有不同的维数——在线性代数中它们有!(第5行是另一个惊喜,但我暂时忽略它)。考虑第二个例子: 现在误差的维数为(n,n)。是的,在第二行中我应该使用(n,)而不是(n,

  • 这个问题与Java表达式中子表达式的求值顺序不同,因为在这里肯定不是“子表达式”。需要加载它进行比较,而不是“求值”。这个问题是特定于Java的,表达式来自一个真实的项目,而不是通常为棘手的面试问题而设计的牵强附会的不切实际的构造。它应该是比较和替换习语的一行替换 它比x86 CMPXCHG指令还要简单,因此在Java中应该使用更短的表达式。

  • 本文向大家介绍Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?相关面试题,主要包含被问及Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 配置变更 JDK 版本升级 第三方类库升级 响应式 Spring 编程支持 HTTP/2 支持 配置属性绑定 更多改进与加强…