为什么 Numpy 只有维度 (n,) 而不是 (n,1) [重复]

2024-02-10

我对此感到好奇有一段时间了。我可以忍受这一点,但如果不采取足够的照顾,它总是会咬我,所以我决定将其发布在这里。假设以下示例(Numpy 版本 = 1.8.2):

a = array([[0, 1], [2, 3]])
print shape(a[0:0, :]) # (0, 2)
print shape(a[0:1, :]) # (1, 2)
print shape(a[0:2, :]) # (2, 2)
print shape(a[0:100, :]) # (2, 2)

print shape(a[0]) # (2, )
print shape(a[0, :]) # (2, )
print shape(a[:, 0]) # (2, )

我不知道其他人感觉如何,但结果对我来说感觉不一致。最后一行是列向量,而倒数第二行是行向量,它们应该具有不同的维度 - 在线性代数中它们确实如此! (第 5 行是另一个惊喜,但我暂时忽略它)。考虑第二个例子:

solution = scipy.sparse.linalg.dsolve.linsolve.spsolve(A, b) # solution of dimension (n, )
analytic = reshape(f(x, y), (n, 1)) # analytic of dimension (n, 1)
error = solution - analytic

现在误差的维度是 (n, n)。是的,在第二行中我应该使用 (n, ) 而不是 (n, 1),但为什么呢?我曾经经常使用 MATLAB,其中一维向量的维度为 (n, 1),linspace/arange 返回维度为 (n, 1) 的数组,并且从不存在 (n, )。但在 Numpy 中 (n, 1) 和 (n, ) 并存,并且有许多单独处理维度的函数:atleast、newaxis 和 reshape 的不同用途,但对我来说,这些函数更多的是混乱而不是帮助。如果一个数组打印成[1,2,3],那么直观上维度应该是[1,3]而不是[3,],对吗?如果 Numpy 没有 (n, ),我只能看到清晰度的提高,而不是功能的损失。

所以这背后一定有一些设计原因。我一直在寻找,但没有找到明确的答案或报告。有人可以帮助澄清这种困惑或为我提供一些有用的参考吗?非常感谢您的帮助。


numpy的哲学不是这样的a[:, 0]是一个“列向量”并且a[0, :]一般情况下的“行向量”。相反,很简单,它们都是向量,即具有一维且只有一维的数组。这实际上是高度合乎逻辑和一致的(但是,是的,对于我们这些习惯了 Matlab 的人来说可能会很烦人)。

我说“在一般情况下”是因为这对于 numpy 最通用的数据结构来说是正确的,即array,它适用于各种多维密集数据存储和操作应用程序,而不仅仅是矩阵数学。拥有“行”和“列”是数组操作的高度专业化上下文,但是的,这是一个非常常见的上下文:这就是为什么numpy还供应matrix班级。将您的数组转换为numpy.matrix(或使用matrix构造函数而不是array首先),您会看到行为更接近您的期望。有关更多信息,请参阅numpy 数组和矩阵有什么区别?我应该使用哪一个? https://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-i-u

对于处理超过 2 维的情况,请查看numpy.expand_dims功能。尽管语法令人烦恼地冗余且冗长,但当我处理超过 2 维的数组时(因此不能使用matrix),我永远不得不使用expand_dims做这种事情:

A -= numpy.expand_dims( A.mean( axis=2 ), 2 )   # subtract mean-across-layers from A

代替

A -= A.mean( axis=2 )   # throw an exception while naively attempting to subtract mean-across-layers from A

但相比之下,考虑一下 Matlab。 Matlab 隐含地断言不存在一维对象这样的东西,并且一个东西的最小维数是 2。当然,你和我都对此非常习惯,但请花点时间意识到这是多么任意这是。本质上的一维对象和恰好在其一个维度中具有范围 1 的二维对象之间存在明显的概念差异:后者允许在其第二维度中增长,而前者则不允许甚至知道第二维度意味着什么——为什么要知道呢?因此a.shape==(N,) and a.shape==(N,1)作为单独的案例非常有意义。你不妨问“为什么不(N, 1, 1)?”或“为什么不是(N, 1, 1, 1, 1, 1, 1)?"

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Numpy 只有维度 (n,) 而不是 (n,1) [重复] 的相关文章

随机推荐

  • 将时间字符串转换为日期对象[重复]

    这个问题在这里已经有答案了 我正在使用时间选择器 它需要一个日期对象 从数据库中我得到一个像 17 00 00 这样的时间字符串 如何将 17 00 00 这样的时间字符串转换为日期对象 Edit我已经尝试过 Mike C Alex K 建
  • 如何将颜色与透明度混合?

    我希望能够混合两个或多个颜色对象 假设我从半透明的红色开始 var 红色 Color FromArgb 140 255 0 0 然后我想将半透明的绿色混合到其中 var green Color FromArgb 140 0 255 0 我遇
  • Select2 - 过滤特殊字符

    我的 select2 插件有问题 当我使用过滤器并输入 m ka 时 它会找到所有带有 m ka 和 maka 单词的选项 是否可以自定义此脚本以仅查找 m ka 单词 在此预览 https i stack imgur com Cd6Wf
  • 项目欧拉问题 14 的进一步优化(Collat​​z 序列)

    当我第一次开始尝试这个问题时 我的代码需要一分多钟才能完成运行并给我答案 我已经尝试过动态编程并存储以前的数字 因此不必多次运行相同的数字 我也尝试过压缩 n3 1 和 n 2 合并成一行 n3 1 但这两者都只能将我的代码缩短到 10 秒
  • 在可移植类库中包含 XPathSelectElement

    我该如何使用XPathSelectElement在便携式类库中 当我尝试包括System Xml XPath在项目中进行汇编时 出现以下错误 类型 System Xml Linq XElement 是在未引用的程序集中定义的 您必须添加对程
  • Scalaquery:按“任意”条件组合进行过滤

    我想加入任意长度的过滤器列表or 如果列表是固定长度的 它看起来像这样 query filter filters 0 filters 1 filter n 连接过滤器and会很容易 for filter filters query quer
  • 如何让openjdk 11支持椭圆曲线密码算法?

    尝试在 java 应用程序中调用 https URL 时出现错误 javax net ssl SSLException 无法生成 ECDH 密钥对 它在 Oracle JDK 1 8 0 152 上运行良好 当我们迁移到 Openjdk 1
  • Django - 跨多个视图形成并保存进度

    我正在开发一个 Django 项目 为了使表单体验更加流畅 我想将 ModelForm 分布在几个页面上 如果登录的用户可以在表单中保存进度而不实际发布内容 在这种情况下 JobApplication用户可以返回填写信息 而无需实际发送应用
  • 是否可以在网格行定义上使用触发器?

    我有一个网格 其行需要根据视图模型动态调整大小 我想做类似以下的事情
  • 在生产模式下构建会导致空页面,而在开发模式下构建则完美运行(Angular 8)

    在开发模式 APS WebAPI 下 构建工作完美 没有错误 ng b watch 当更改为生产模式 ng b aot 或 ng b prod 时 页面加载时不会出现错误 但会导致空页面 Index cshtml 将通过从 Homecont
  • Node.js 编程工作流程 - 测试、代码、测试

    在开始用 Node js 开发有用的东西之前 您的流程是什么 您是否在 VowJS Expresso 上创建测试 你使用 Selenium 测试吗 什么时候 我有兴趣获得一个很好的工作流程来开发所有类似于 Rails 的 Node js 应
  • 如何在具有多个电源的单个模块项目中设置 sbt-native-packager

    我有一个单模块客户端 服务器项目 每个项目都有一个主模块 我正在尝试使用sbt native packager为两者生成启动脚本 项目 P scala object Tactic extends Build lazy val root pr
  • Pointfield 与 geodjango、javascript 和 google 地图

    我正在尝试显示并绘制数据库中存储的纬度和经度点的线 这是我的代码 为了简洁起见 我删除了一些不必要的变量 这是我的模型 class GpsLog models Model device models ForeignKey Device re
  • R 中的滚动计算

    我正在尝试使用数据表在 R 中建立摊销贷款帐户模型 每行代表一个月 每个月都会有一笔还款或预支资金 并根据上个月的余额收取利息 例如 gt loan lt data table loan age seq 0 9 payment c 5000
  • 输出包含所有转义字符的 C++ 字符串

    我有一个像这样的字符串 string s t Hello n 当我打印它时 它会给我一个选项卡 然后是 Hello 然后是一个新行 但是 我是否可以打印它 以便在控制台中看到 t Hello n 换句话说 我希望字符串忽略转义字符并将其视为
  • 使用 Scala 模式匹配时工作正则表达式失败

    在以下代码中 使用 Java API 时会匹配相同的模式 但使用 Scala 模式匹配时不会匹配 import java util regex Pattern object Main extends App val text oAuth h
  • 如何使用批处理文件重命名文件以包含日期?

    我有一个显示警报打印机的文本文件 我想在Windows XP下设置一个批处理文件 以更改警报打印机的默认名称以包含日期 这将使搜索错误变得更加容易 警报打印机被捕获到文本文件中 我已经能够更改名称 但每次我尝试将名称设置为日期时 要么什么也
  • TestNG:在运行时更改线程数

    假设我有一个可以并行或串行执行的套件 然而 这样做的决定要等到运行时才能决定 启动该套件的常见方法如下 TestNG runner new TestNG if runInParallel set parallel mode too here
  • Flash 横幅在 Chrome 中不起作用

    我的网站中有一些 Flash 横幅和一些 GIF 几天前 我注意到使用 Chrome 浏览时 Flash 不工作 用IE浏览时一切正常 这是我的网站的链接 http batgalim org il http batgalim org il
  • 为什么 Numpy 只有维度 (n,) 而不是 (n,1) [重复]

    这个问题在这里已经有答案了 我对此感到好奇有一段时间了 我可以忍受这一点 但如果不采取足够的照顾 它总是会咬我 所以我决定将其发布在这里 假设以下示例 Numpy 版本 1 8 2 a array 0 1 2 3 print shape a