numpy.ndarray 枚举维度的真子集?

2024-02-10

(在这篇文章中,让np可以简写为numpy.)

Suppose a is a (n + k)维np.ndarray对象,对于某些整数n> 1 和k> 1.(哎呀,n + k> 3 的值是a.ndim)。我想列举一下a超过它的第一个n方面;这意味着,在每次迭代时,枚举器/迭代器都会生成一对,其第一个元素是元组ii of n索引,第二个元素是k-次元-ndarray at a[ii] .

诚然,编写一个函数来执行此操作并不困难(事实上,我在下面给出了此类函数的示例),但我想知道这一点:

does numpy提供任何特殊的语法或函数来执行这种类型的“部分”枚举吗?

(通常,当我想迭代多维np.ndarray对象,我用np.ndenumerate,但这在这里没有帮助,因为(据我所知)np.ndenumerate会迭代all n + k方面。)

假设上述问题的答案是肯定的,那么后续操作是:

那么情况又如何呢?n要迭代的维度不连续?

(在这种情况下,枚举器/迭代器每次迭代返回的对的第一个元素将是一个元组r > n元素,其中一些是表示“全部”的特殊值,例如slice(None);该对的第二个元素仍然是ndarray长度k.)

Thanks!


下面的代码有望澄清问题规范。功能partial_enumerate使用任何特殊的方法做我想做的事numpy可用于该目的的构造。遵循以下定义partial_enumerate这是一个简单的例子n = k = 2.

import numpy as np
import itertools as it
def partial_enumerate(nda, n):
  """Enumerate over the first N dimensions of the numpy.ndarray NDA.

  Returns an iterator of pairs.  The first element of each pair is a tuple 
  of N integers, corresponding to a partial index I into NDA; the second element
  is the subarray of NDA at I.
  """

  # ERROR CHECKING & HANDLING OMITTED
  for ii in it.product(*[range(d) for d in nda.shape[:n]]):
    yield ii, nda[ii]

a = np.zeros((2, 3, 4, 5))
for ii, vv in partial_enumerate(a, 2):
    print ii, vv.shape

输出的每一行都是“元组对”,其中第一个元组代表部分集合n坐标在a,第二个代表形状k的维度子数组a在那些部分坐标处; (第二对的值对于所有行都是相同的,正如数组的规律性所预期的那样):

(0, 0) (4, 5)
(0, 1) (4, 5)
(0, 2) (4, 5)
(1, 0) (4, 5)
(1, 1) (4, 5)
(1, 2) (4, 5)

相反,迭代np.ndenumerate(a)在这种情况下会导致a.size迭代,每次访问一个单独的单元格a.


您可以使用 numpy 广播规则生成笛卡尔积。这numpy.ix_函数创建适当数组的列表。它相当于下面的内容:

>>> def pseudo_ix_gen(*arrays):
...     base_shape = [1 for arr in arrays]
...     for dim, arr in enumerate(arrays):
...         shape = base_shape[:]
...         shape[dim] = len(arr)
...         yield numpy.array(arr).reshape(shape)
... 
>>> def pseudo_ix_(*arrays):
...     return list(pseudo_ix_gen(*arrays))

或者,更简洁地说:

>>> def pseudo_ix_(*arrays):
...     shapes = numpy.diagflat([len(a) - 1 for a in arrays]) + 1
...     return [numpy.array(a).reshape(s) for a, s in zip(arrays, shapes)]

结果是可广播数组的列表:

>>> numpy.ix_(*[[2, 4], [1, 3], [0, 2]])
[array([[[2]],

       [[4]]]), array([[[1],
        [3]]]), array([[[0, 2]]])]

将其与结果进行比较numpy.ogrid:

>>> numpy.ogrid[0:2, 0:2, 0:2]
[array([[[0]],

       [[1]]]), array([[[0],
        [1]]]), array([[[0, 1]]])]

正如你所看到的,它是相同的,但是numpy.ix_允许您使用非连续索引。现在,当我们应用 numpy 广播规则时,我们得到一个笛卡尔积:

>>> list(numpy.broadcast(*numpy.ix_(*[[2, 4], [1, 3], [0, 2]])))
[(2, 1, 0), (2, 1, 2), (2, 3, 0), (2, 3, 2), 
 (4, 1, 0), (4, 1, 2), (4, 3, 0), (4, 3, 2)]

如果,而不是传递结果numpy.ix_ to numpy.broadcast,我们用它来索引一个数组,我们得到这个:

>>> a = numpy.arange(6 ** 4).reshape((6, 6, 6, 6))
>>> a[numpy.ix_(*[[2, 4], [1, 3], [0, 2]])]
array([[[[468, 469, 470, 471, 472, 473],
         [480, 481, 482, 483, 484, 485]],

        [[540, 541, 542, 543, 544, 545],
         [552, 553, 554, 555, 556, 557]]],


       [[[900, 901, 902, 903, 904, 905],
         [912, 913, 914, 915, 916, 917]],

        [[972, 973, 974, 975, 976, 977],
         [984, 985, 986, 987, 988, 989]]]])

然而,买者自负。可广播数组对于索引很有用,但如果您确实想要枚举值,你可能最好使用itertools.product:

>>> %timeit list(itertools.product(range(5), repeat=5))
10000 loops, best of 3: 196 us per loop
>>> %timeit list(numpy.broadcast(*numpy.ix_(*([range(5)] * 5))))
100 loops, best of 3: 2.74 ms per loop

所以如果你无论如何都要合并一个 for 循环,那么itertools.product可能会更快。不过,您仍然可以使用上述方法在纯 numpy 中获取一些类似的数据结构:

>> pgrid_idx = numpy.ix_(*[[2, 4], [1, 3], [0, 2]])
>>> sub_indices = numpy.rec.fromarrays(numpy.indices((6, 6, 6)))
>>> a[pgrid_idx].reshape((8, 6))
array([[468, 469, 470, 471, 472, 473],
       [480, 481, 482, 483, 484, 485],
       [540, 541, 542, 543, 544, 545],
       [552, 553, 554, 555, 556, 557],
       [900, 901, 902, 903, 904, 905],
       [912, 913, 914, 915, 916, 917],
       [972, 973, 974, 975, 976, 977],
       [984, 985, 986, 987, 988, 989]])
>>> sub_indices[pgrid_idx].reshape((8,))
rec.array([(2, 1, 0), (2, 1, 2), (2, 3, 0), (2, 3, 2), 
           (4, 1, 0), (4, 1, 2), (4, 3, 0), (4, 3, 2)], 
          dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8')])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numpy.ndarray 枚举维度的真子集? 的相关文章

  • 在 Pandas 中按日期获取有效合约

    我在检测 pandas DataFrame 中的活动合约方面遇到了一些困难 假设每一行都是一个协商 对于每一行 我有两列 initial date 和 end date 我想知道的是按日期划分的活跃合约数量 到目前为止我做了一个非常低效的方
  • 如何在Python中循环并存储自变量中的值

    我对 python 很陌生 所以这听起来可能很愚蠢 我进行了搜索 但没有找到解决方案 我在 python 中有一个名为 ExcRng 的函数 我可以对该函数执行什么样的 for 循环 以便将值存储在独立变量中 我不想将它们存储在列表中 而是
  • on_delete=models.PROTECT 和 on_delete=models.CASCADE 在 Django 模型上有什么作用?

    我对 Django 很熟悉 但最近注意到有一个on delete models CASCADE and on delete models PROTECT模型的选项 on delete models CASCADE and on delete
  • 从字符串到类型的词法转换

    最近 我尝试用Python存储和读取文件中的信息 遇到了一个小问题 我想从文本文件中读取类型信息 从 string 到 int 或 float 的类型转换非常有效 但从 string 到 type 的类型转换似乎是另一个问题 当然 我尝试了
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • PIL Image.size 返回相反的宽度/高度

    使用PIL确定图像的宽度和高度 在特定图像上 幸运的是只有这一个 但这很麻烦 从 image size 返回的宽度 高度是相反的 图片 http storage googleapis com cookila 533ebf752b9d1f7c
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • 创建一个类似于 Tkinter 的表

    我希望创建类似于 Tkinter 中的表格的东西 但它不一定是这样的 例如 我想创建标题 Name1 Name2 Value 并在每个标题下面有几个空白行 然后 我希望稍后用我计算的值或名称的字符串值填充这些行 因此是标签 对于 Name2
  • 将 Pandas 列中的列表拆分为单独的列

    这是我在 pandas 数据框中的 特征 列 Feature Cricket 82379 Kabaddi 255 Reality 4751 Cricket 15640 Wildlife 730 LiveTV 13 Football 4129
  • Django 在选择列表更改时创建毫无意义的迁移

    我正在尝试使用可调用创建一个带有选择字段的模型 以便 Django 在选择列表更改时不会创建迁移 如中所述this https stackoverflow com questions 31788450 stop django from cr
  • 无法截取宽度为 0 的屏幕截图

    我正在尝试截取 Bootstrap 模态内元素的屏幕截图 经过一番努力 我终于想出了这段代码 driver get https enlinea sunedu gob pe driver find element by xpath div c
  • conda-env list / conda info --envs 如何查找环境?

    我一直在尝试 anaconda miniconda 因为我的用户使用随 miniconda 安装的结构生物学程序 并且作者都没有 A 考虑到可能存在其他 miniconda 应用程序 B 他们的程序将在多用户环境中使用 因此 使用 Arch
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • 为什么我们应该在 def __init__(self, n) -> None: 中使用 -> ?

    我们为什么要使用 gt in def init self n gt None 我读了以下摘录来自 PEP 484 https www python org dev peps pep 0484 the meaning of annotatio
  • 如何将列表字典写入字符串而不是 CSV 文件?

    This 堆栈溢出问题 https stackoverflow com questions 37997085 how to write a dictionary of lists to a csv file将列表字典写入 CSV 文件的答案
  • 使用 Python 生成类似于 Messenger 或 kik 代码的圆形二维码

    我可以使用 Python 生成圆形 QR 码 就像 Facebook Messenger 或 kik 使用的那样吗 我访问了很多网站 但找不到这种类型的二维码 默认情况下 Python 生成方形 QR 码 但在我的项目中我想要圆形 QR 码
  • Django South - 将 null=True 字段转换为 null=False 字段

    我的问题是 转变的最佳做法是什么null True场变成null False使用 Django South 的字段 具体来说 我正在与ForeignKey 你应该先写一个数据迁移 http south aeracode org docs t

随机推荐

  • 在 TinyMCE 中设置数据 URI

    TinyMCE 初始化选项 scope tinymceOptions plugins base64img image imagetools paste relative urls false paste data images true p
  • Bea Weblogic 工作文件夹在哪里

    我知道这可能是一个微不足道的问题 但我确实找不到 Oracle BEA weblogic 10 3 中的工作文件夹 与 Apache Tomcat 不同 它显然位于工作目录中 通常位于 WEB INF 下 我已经研究过了爪哇牧场 http
  • 将 lambda 或 api 网关的访问限制为特定 vpc

    是否有可能制作一个API网关 or lambda只能由特定 vpc 访问的功能 我在亚马逊文档中搜索 但没有找到有关此主题的任何内容 先感谢您 不幸的是 您将无法做到这一点 请参阅下面的更新 s3 是通过以下方式提供这种控制访问的服务桶策略
  • 如何强制Apache使用手动预压缩的CSS和JS文件的gz文件?

    我有一个简单的问题 我有网络目录 css里面是文件style css 我已手动压缩此文件并将其另存为style css gz 我想节省 CPU 周期 以免在每次请求时都压缩 CSS 文件 如何配置 Apache 来查找此内容 gz归档并提供
  • Sinatra 测试总是 404'ing

    我有一个非常简单的 Sinatra 应用程序 但在测试时遇到了问题 基本上 当我从浏览器中的测试得知该请求工作正常时 每个请求测试都会返回 404 关于问题可能是什么的任何想法吗 测试助手 rb ENV RACK ENV test lt l
  • Zend 2 数据库事务?

    我们如何在 Zend 2 中使用事务 我在 API 中没有找到任何内容 Zend 1 的几个问题涉及常规 PDO 函数 但我在 Zend 2 中没有看到类似的内容 ZF2 这个部门的文档有点缺乏 开始交易 this gt adapter g
  • Javascript - 记住选择的选项

    我有一个通过 javascript 注入创建的网页 其中一个页面有一个下拉列表 如下所示 html
  • 我们应该在哪里使用@Transactional,Service层在哪里?

    我在 Spring 中有休息风格的控制器 在控制器中我注入了 dao 接口 我从控制器保存数据 换句话说 我有 REST Web 服务 人们向我发送数据 我保留它 Payment rest controller which receives
  • 自动热键窗口出现事件

    我正在使用 WorkRave 休息提醒 并希望在休息窗口出现时关闭屏幕 我知道如何将其关闭 如何在指定窗口 IfWinActive ahk class 出现时创建事件 另外 我可以绑定 符号吗 不起作用 而是其他的 要获得出现窗口的即时通知
  • Laravel 会话存储未根据请求设置

    我正在开发一个小型网站 并且在会话方面遇到问题 当我尝试登录或进行 AJAX 调用时 出现以下 RuntimeException RuntimeException in Request php line 758 Session store
  • 如何避免在信号处理程序中使用 printf?

    Since printf不可重入 在信号处理程序中使用它不应该是安全的 但我见过很多使用的示例代码printf这边走 所以我的问题是 我们什么时候需要避免使用printf在信号处理程序中 是否有推荐的替代品 主要问题是如果信号中断mallo
  • 我应该在 ViewHolder 中哪里取消绑定 ButterKnife 8.x.x?

    我有一个使用 ButterKnife 注释的 RecycleView ViewHolder 类 我的代码也应该在这个 ViewHolder 类中 unbind 吗 public class AView extends RecyclerVie
  • 填写缺失值

    伙计们 我有这张桌子 stime datetime svalue 1 13 2014 8 40 00 AM 5 1 13 2014 8 45 00 AM 6 1 13 2014 8 46 00 AM 5 1 13 2014 8 50 00
  • 在 Android 中,如何更改 onOptionsItemSelected() 内不同 MenuItem 的标题

    单击 Android 中选项菜单中的某个 MenuItem 时 我需要更改同一菜单中不同 MenuItem 的标题 有什么方法可以做到这一点 当单击选项菜单中的 MenuItem 时 将调用 onOptionsItemSelected Me
  • OpenCL 本地内存大小和计算单元数量

    每个 GPU 设备 AMD NVidea 或任何其他 都分为多个计算单元 多处理器 每个计算单元都有固定数量的内核 顶点着色器 流处理器 所以 一个人有 Compute Units x VertexShaders compute unit
  • 如何在java中使用math.pi

    我在转换此公式时遇到问题V 4 3 r 3 我用了Math PI and Math pow 但我收到此错误 预期的 此外 直径变量不起作用 那里有错误吗 import java util Scanner import javax swing
  • 有没有办法将 SQL 数据库链接到 LDAP 服务器

    我们有一个 SQL 联系人数据库 它链接到我们所有的项目信息 其中包含很多附加功能 最近有人建议我们在最终用户的电子邮件客户端中提供此信息的联系人部分 因此我们正在考虑设置 LDAP 服务器 是否有任何工具可以让我们将数据库中的信息 可能是
  • 如何使用 R 和 dplyr 连接不同 SQL 数据库中的表?

    我在用着dplyr 0 7 0 dbplyr 1 0 0 DBI 0 6 1 and odbc 1 0 1 9000 我想做如下的事情 db1 lt DBI dbConnect odbc odbc Driver SQL Server Ser
  • 如何将外部数据库连接到AppEngine?

    有没有什么方法 比使用更好UrlFetch 连接到任何外部数据库来自应用程序引擎 我已经了解托管 SQL 数据库商业应用引擎 http code google com appengine business 但它们不是免费的 并将在 2011
  • numpy.ndarray 枚举维度的真子集?

    在这篇文章中 让np可以简写为numpy Suppose a is a n k 维np ndarray对象 对于某些整数n gt 1 和k gt 1 哎呀 n k gt 3 的值是a ndim 我想列举一下a超过它的第一个n方面 这意味着