numpy.array 形状 (R, 1) 和 (R,) 之间的区别

2023-11-22

In numpy,一些操作恢复原状(R, 1)但有些返回(R,)。这将使矩阵乘法更加繁琐,因为显式reshape是必须的。例如,给定一个矩阵M,如果我们想做numpy.dot(M[:,0], numpy.ones((1, R))) where R是行数(当然,同样的问题也发生在列上)。我们将得到matrices are not aligned错误自M[:,0]状态良好(R,) but numpy.ones((1, R))状态良好(1, R).

所以我的问题是:

  1. 形状有什么区别(R, 1) and (R,)。我从字面上知道它是数字列表和列表列表,其中所有列表仅包含一个数字。只是想知道为什么不设计numpy以便它有利于形状(R, 1)代替(R,)为了更容易的矩阵乘法。

  2. 对于上面的例子,还有更好的方法吗?没有像这样显式重塑:numpy.dot(M[:,0].reshape(R, 1), numpy.ones((1, R)))


1.NumPy中形状的含义

你写道,“我从字面上知道它是数字列表和列表列表,其中所有列表仅包含一个数字”,但这是一种无益的思考方式。

考虑 NumPy 数组的最佳方式是它们由两部分组成:数据缓冲区这只是一个原始元素块,以及view它描述了如何解释数据缓冲区。

例如,如果我们创建一个包含 12 个整数的数组:

>>> a = numpy.arange(12)
>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

Then a由一个数据缓冲区组成,排列如下:

┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│  0 │  1 │  2 │  3 │  4 │  5 │  6 │  7 │  8 │  9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘

以及描述如何解释数据的视图:

>>> a.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
>>> a.dtype
dtype('int64')
>>> a.itemsize
8
>>> a.strides
(8,)
>>> a.shape
(12,)

这里的shape (12,)表示数组由从 0 到 11 的单个索引进行索引。从概念上讲,如果我们标记这个单个索引i,数组a看起来像这样:

i= 0    1    2    3    4    5    6    7    8    9   10   11
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│  0 │  1 │  2 │  3 │  4 │  5 │  6 │  7 │  8 │  9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘

If we reshape一个数组,这不会改变数据缓冲区。相反,它创建了一个新视图来描述解释数据的不同方式。所以之后:

>>> b = a.reshape((3, 4))

数组b具有相同的数据缓冲区a,但现在它的索引为two索引分别从 0 到 2 和 0 到 3。如果我们标记两个索引i and j,数组b看起来像这样:

i= 0    0    0    0    1    1    1    1    2    2    2    2
j= 0    1    2    3    0    1    2    3    0    1    2    3
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│  0 │  1 │  2 │  3 │  4 │  5 │  6 │  7 │  8 │  9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘

意思就是:

>>> b[2,1]
9

可以看到第二个索引变化很快,第一个索引变化很慢。如果您希望反过来,您可以指定order范围:

>>> c = a.reshape((3, 4), order='F')

这会产生一个索引如下的数组:

i= 0    1    2    0    1    2    0    1    2    0    1    2
j= 0    0    0    1    1    1    2    2    2    3    3    3
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│  0 │  1 │  2 │  3 │  4 │  5 │  6 │  7 │  8 │  9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘

意思就是:

>>> c[2,1]
5

现在应该清楚数组具有一维或多维大小为 1 的形状意味着什么。之后:

>>> d = a.reshape((12, 1))

数组d由两个索引进行索引,第一个索引从 0 到 11,第二个索引始终为 0:

i= 0    1    2    3    4    5    6    7    8    9   10   11
j= 0    0    0    0    0    0    0    0    0    0    0    0
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│  0 │  1 │  2 │  3 │  4 │  5 │  6 │  7 │  8 │  9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘

and so:

>>> d[10,0]
10

长度为 1 的维度是“自由”的(在某种意义上),因此没有什么可以阻止您进城:

>>> e = a.reshape((1, 2, 1, 6, 1))

给出一个像这样索引的数组:

i= 0    0    0    0    0    0    0    0    0    0    0    0
j= 0    0    0    0    0    0    1    1    1    1    1    1
k= 0    0    0    0    0    0    0    0    0    0    0    0
l= 0    1    2    3    4    5    0    1    2    3    4    5
m= 0    0    0    0    0    0    0    0    0    0    0    0
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│  0 │  1 │  2 │  3 │  4 │  5 │  6 │  7 │  8 │  9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘

and so:

>>> e[0,1,0,0,0]
6

See the NumPy 内部文档有关如何实现数组的更多详细信息。

2. 该怎么办?

Since numpy.reshape只是创建一个新视图,您不应该害怕在必要时使用它。当您想以不同的方式对数组进行索引时,它是正确的工具。

然而,在长时间的计算中,通常可以首先安排构造具有“正确”形状的数组,从而最大限度地减少重塑和转置的次数。但如果没有看到导致需要重塑的实际背景,就很难说应该改变什么。

你问题中的例子是:

numpy.dot(M[:,0], numpy.ones((1, R)))

但这是不现实的。首先,这个表达式:

M[:,0].sum()

更简单地计算结果。其次,第 0 列真的有什么特别之处吗?也许你真正需要的是:

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

numpy.array 形状 (R, 1) 和 (R,) 之间的区别 的相关文章

随机推荐

  • 散列/分片动作块

    我需要并行处理某些项目的持续流动 因此我正在使用TPL Dataflow 问题是共享相同键的项目 类似于字典 应该以 FIFO 顺序处理 而不是彼此并行 它们可以与具有不同值的其他项目并行 正在完成的工作非常受 CPU 限制 并且具有最少的
  • 如何从函数内部删除全局变量?

    我有一个全局变量ser在某些情况下我需要删除 global ser ser some stuff def reset ser print deleting serial configuration del ser 如果我打电话reset s
  • 尝试运行 java fx 应用程序时出现“FXMLLoader.constructLoadException”

    我已经搜索了互联网的最深处 但似乎找不到答案 问题出在我想编写的 javaFx 程序中 但我不能比添加控制器类更进一步 我几乎遵循了可以找到的所有教程 但我仍然不知道这个问题 这是例外 javafx fxml LoadException U
  • 如何在 C# 中重写 List 的 Add 方法?

    我目前正在寻找自己的收藏 它就像一个常规列表 只不过它只能容纳 10 件物品 如果在列表中已有 10 个项目时添加一个项目 则在添加新项目之前将删除第一个项目 我想做的是创建一个扩展的类System Collections Generic
  • 使用 Code First EF4.1 保存时如何向属性添加默认值?

    我首先创建一些这样的模型 public abstract class EditableBase public DateTime CreatedOn get set public DateTime ModifiedOn get set pub
  • 限制 dropwizard 管理页面

    如何对Dropwizard管理门户进行身份验证 以限制普通用户访问它 请帮忙 在您的配置中 您可以设置adminUsername and adminPassword under http像这样 http adminUsername user
  • 将字符串拆分为相同字母的块[重复]

    这个问题在这里已经有答案了 这很容易 我就是做不到 在这个例子中 我想做的就是将下面的字符串分割成彼此相邻的相同字母块 例如在下面的示例中 test AAATGG 将被拆分为 AAA T GG 我一直在尝试不同的方法 下面是一个例子 我将不
  • django settings.py中的“os.environ”无法使用apache和wsgi获取系统环境变量

    我这样设置 djangosetting py import os from django core exceptions import ImproperlyConfigured def get env variable var name t
  • JavaScript REST 客户端库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有一个 JavaScript 库允许我执行所有 REST 操作 例如 GET POST PUT and DELETE over HTTP or
  • colspan 网格视图行

    我已将行添加到 gridview 中 gridview中有20列 我如何在 gridview 中执行类似 colspan 的功能 该功能可以在 2 3 列下显示 2 3 行 并保留为 colspan 基本上我希望在 gridview 的行上
  • 无法使用 Windows 身份验证登录 SQL Server [已关闭]

    Closed 这个问题是无关 目前不接受答案 我刚刚安装了 SQL Server 2012 并打开 SQL Server Management Studio 当我尝试登录时出现此问题 无法连接到 我的问题是我如何知道服务器名称是什么 当我转
  • Google 地图上的自定义点击窗口

    我只是在看其中的一个谷歌地图在 iPhone 中实现 包含标签和按钮 如何在 Android 中获得这种包含标签 按钮和图像的窗口 请向我提供相同的来源 Stone 我已经给出了这个问题的答案 但我还有另一个答案 与上图中您想要的相同 pa
  • 当其他应用程序在 Android 中使用麦克风时,无法访问麦克风

    我使用以下 URL 中的代码通过 AudioRecord 从麦克风获取声音数据 http www dreamincode net forums topic 303235 visualizing sound from the micropho
  • 如何快速将分钟添加到当前时间

    我是 Swift 新手 正在尝试调度程序 我选择了开始时间 需要在开始时间上添加 5 分钟 或其倍数 并将其显示在UILabel IBAction func timePickerClicked sender UIDatePicker var
  • 有没有办法从 bash 运行 zip 文件中的 python 脚本?

    我知道有一种方法可以使用 python 导入 zip 文件中的模块 我在 zip 文件中创建了一种自定义 python 包库 我也想将我的 任务 脚本放入这个包中 这些脚本正在使用该库 然后 使用 bash 我想调用 zip 文件中所需的脚
  • cmdlet 如何知道何时真正应该调用 WriteVerbose()?

    cmdlet 如何知道何时really应该打电话WriteVerbose WriteDebug 等等 也许我错过了一些简单的事情 但我找不到答案 所有 cmdlet 到目前为止我见过的实现只是调用WriteVerbose 没有任何 犹豫 我
  • 在solaris中获取昨天的日期

    我正在运行 SunOS bash 3 00 uname a SunOS lvsaishdc3in0001 5 10 Generic 142901 02 i86pc i386 i86pc 我需要找到Yesterday s date in li
  • 如何在 web.xml 中的 标记中指定根上下文?

    我想在 WAR 文件中指定 Java Web 应用程序的根上下文 我怎样才能使用有效的方法来做到这一点web appXML 中的web xml file 哦 是的 我想以与应用程序服务器无关的方式执行此操作 这不能以与应用程序服务器无关的方
  • Typescript:我可以定义一个 n 长度的元组类型吗?

    我正在使用 Typescript 创建一个将棋游戏板 将棋盘有 9 个等级 我想将 9x9 多维数组断言为一种类型 以确保数组的大小和内容 目前我正在这样创建 9x9 板类型 type Board9x9 p P P P P P P P P
  • numpy.array 形状 (R, 1) 和 (R,) 之间的区别

    In numpy 一些操作恢复原状 R 1 但有些返回 R 这将使矩阵乘法更加繁琐 因为显式reshape是必须的 例如 给定一个矩阵M 如果我们想做numpy dot M 0 numpy ones 1 R where R是行数 当然 同样