从连续的数组切片或卷组成矩阵

2024-01-30

我有一个像这样的数组:

[10 20 30 40]

我想建立一个矩阵M1像这样:

10  0  0  0
20 10  0  0
30 20 10  0
40 30 20 10

我的方法是首先构建以下矩阵M2在数组的连续“卷”之外:

10 20 30 40
20 10 40 30
30 20 10 40
40 30 20 10

然后取下三角矩阵np.tril https://docs.scipy.org/doc/numpy/reference/generated/numpy.tril.html。那么我会对有效的构建方法感兴趣M2 or M1直接不经过M2.

构建 M2 的一个简单方法可能是:

import numpy as np

def M2_simple(a):
    a = np.asarray(a)
    return np.stack([a[np.arange(-i, len(a) - i)] for i in range(len(a))]).T

print(M2_simple(np.array([10, 20, 30, 40])))
# [[10 40 30 20]
#  [20 10 40 30]
#  [30 20 10 40]
#  [40 30 20 10]]

经过一番尝试,我得出了以下更好的解决方案,基于高级索引 https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing:

def M2_indexing(a):
    a = np.asarray(a)
    r = np.arange(len(a))[np.newaxis]
    return a[np.newaxis][np.zeros_like(r), r - r.T].T

这显然比以前快得多,但测量性能似乎仍然没有达到应有的速度(例如,它比平铺需要更长的数量级,而不是so不同的操作),并且它需要我构建大的索引矩阵。

有没有更好的方法来构建这些矩阵?


EDIT:

事实上,你可以构建M1直接使用同样的方法:

import numpy as np

def M1_strided(a):
    a = np.asarray(a)
    n = len(a)
    s, = a.strides
    a0 = np.concatenate([np.zeros(len(a) - 1, a.dtype), a])
    return np.lib.stride_tricks.as_strided(
        a0, (n, n), (s, s), writeable=False)[:, ::-1]

print(M1_strided(np.array([10, 20, 30, 40])))
# [[10  0  0  0]
#  [20 10  0  0]
#  [30 20 10  0]
#  [40 30 20 10]]

在这种情况下,速度优势甚至更好,因为您将呼叫保存到np.tril https://docs.scipy.org/doc/numpy/reference/generated/numpy.tril.html:

N = 100
a = np.square(np.arange(N))
%timeit np.tril(M2_simple(a))
# 792 µs ± 15.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.tril(M2_indexing(a))
# 259 µs ± 9.45 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.tril(M2_strided(a))
# 134 µs ± 1.68 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit M1_strided(a)
# 45.2 µs ± 583 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

您可以构建M2矩阵更有效np.lib.stride_tricks.as_strided https://docs.scipy.org/doc/numpy/reference/generated/numpy.lib.stride_tricks.as_strided.html:

import numpy as np
from numpy.lib.stride_tricks import as_strided

def M2_strided(a):
    a = np.asarray(a)
    n = len(a)
    s, = a.strides
    return np.lib.stride_tricks.as_strided(
        np.tile(a[::-1], 2), (n, n), (s, s), writeable=False)[::-1]

作为额外的好处,您将只使用原始数组两倍的内存(而不是平方大小)。您只需要小心不要写入这样创建的数组(如果您要调用,这应该不是问题np.tril https://docs.scipy.org/doc/numpy/reference/generated/numpy.tril.html稍后)-我补充说writeable=False禁止写入操作。

与 IPython 的快速速度比较:

N = 100
a = np.square(np.arange(N))
%timeit M2_simple(a)
# 693 µs ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit M2_indexing(a)
# 163 µs ± 1.88 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit M2_strided(a)
# 38.3 µs ± 348 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从连续的数组切片或卷组成矩阵 的相关文章

  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • pandas DataFrame.join 的运行时间是多少(大“O”顺序)?

    这个问题更具概念性 理论性 与非常大的数据集的运行时间有关 所以我很抱歉没有一个最小的例子来展示 我有一堆来自两个不同传感器的数据帧 我需要最终将它们连接成两个very来自两个不同传感器的大数据帧 df snsr1 and df snsr2
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • 根据 Pandas 中的列表选择数据框行的子集

    我有一个数据框df1并列出x In 22 import pandas as pd In 23 df1 pd DataFrame C range 5 B range 10 20 2 A list abcde In 24 df1 Out 24
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • Java 8 epoch-millis 时间戳到格式化日期,如何?

    在 Java 8 之前 我习惯于始终将任何与日期 时间相关的内容保留为自纪元以来的毫秒数 并且仅在退出时处理人类可读的日期 时间 即在 UI 或日志文件中 或在解析用户生成的输入时 我认为这对于 Java 8 来说仍然是安全的 现在我正在寻
  • RestKit - 将数组的键路径映射到该数组内部的对象

    我真的很喜欢用 RestKit 0 20 来解析这个特定的响应 addons id 1 name Addon one version 2 id 2 name Addon two version 3 forms id 1 name Form
  • 在 Python 中打印格式正确的 SQLite 表

    我编写了一个 Python 脚本来向表中添加行 我决定如果我也可以使用相同的脚本查看我的表 而不必退出脚本并运行 sqlite3 或切换到另一个 shell 并运行 sqlite3 那就太好了 所以我写下了我期望的内容 它会给我我想要的东西
  • Angular - 单击时使用动态 ID 专注于输入

    有很多类似的问题 但我还没有找到真正的重复问题来回答我的问题 如果我错过了一些东西 我深表歉意 我有一个包含多个输入 按钮的页面 重复相同的组件 并且需要在单击按钮时关注正确的输入 我尝试过 elementRef nativeElement
  • 将文本添加到 MySQL 列名称之前

    假设一个查询例如 SELECT FROM tableA 我怎样才能前置a 每列的名称 例如 如果有一列 用户名 它将在结果中作为 a username 进行访问 EDIT The SELECT username AS a username格
  • Rails 3 原型渲染:更新响应具有 text/html 内容类型

    我正在尝试让一些用原型和 Rails 2 3 11 编写的 RJS 代码在 Rails 3 2 1 中工作 我有prototype rails宝石 所以render update do page 有效 我正在使用一个表单 remote gt
  • 如何快速创建指向 Eclipse 中元素的 Javadoc 链接?

    我想在我的 Javadoc 中轻松创建类 方法 字段等的链接 而无需键入完整的表达式 例如 link AllowAllHostnameVerifier 在 Eclipse 中执行此操作最快的方法是什么 If you don t alread
  • 如何使用 PostgreSQL 将字符串转换为 unicode?

    在这里我想将我的字符串转换为unicode 我使用的是 PostgreSQL 9 3 版本 在 SQL Server 中 这要简单得多 Example sql N select from tabletest For nvarchar nch
  • UITableViewController 中的复制/粘贴功能

    我有一个 UITableViewController 我想在用户触摸单元格时弹出复制 粘贴菜单 我想像在 通讯录 应用程序中那样进行操作 如何实现这个功能 有人能帮我吗 我试过这段代码 UIMenuController theMenu UI
  • 编译时出错:“预期的类、委托、枚举、接口或结构”

    这段代码有什么问题 该程序旨在复制文件并将其通过电子邮件发送到电子邮件地址 但事实并非如此 using System using System Collections Generic using System ComponentModel
  • 为什么docker容器会立即退出

    我使用在后台运行一个容器 docker run d name hadoop h Service 它很快就退出了 但如果我在前台运行 它工作得很好 我使用检查日志 docker logs hadoop 没有错误 有任何想法吗 Dockerfi
  • python 图像库保存函数

    我刚刚使用 python 图像库 PIL 完成了一些图像处理 但无法使保存功能正常工作 整个代码工作正常 但它只是不会保存结果图像 代码如下 im Image new rgb 200 10 ddd draw Image draw draw
  • 在 C 中分配 128 位整数

    当我尝试在 gcc 4 9 1 中分配一个 128 位整数时 我得到一个warning integer constant is too large for its type 示例代码 int main void uint128 t p 47
  • for-await-of 简单示例(打字稿)

    在 typescript 2 3 中引入了一个新功能 for await of 任何人都可以发布一个简单的示例来说明如何将其与 Promise 一起使用以及其主要用例是什么 我正在研究更改日志中的示例 async function f fo
  • 如何根据另一个元素的高度调整列的高度?

    我在左侧有一种间隔列 实际上我希望它的高度与该页面上文本的长度相同 这显然因页面而异 这是CSS sidebox width 200px height 2000px float left padding 5px background f4f
  • 在唯一列中的行之间切换值

    假设您有一张这样的表 id name 1 foo 2 bar 存在唯一性约束name column 你会如何设置行id 2 to foo 以及行id 1 to bar 我知道您可能只需为两者分配临时名称 然后粘贴所需的名称 但这似乎不是最简
  • Windows API CreateFile() 中 OPEN_ALWAYS 和 CREATE_ALWAYS 的区别

    谁能解释一下创造配置之间有什么区别OPEN ALWAYS and CREATE ALWAYS of the 创建文件 http msdn microsoft com en us library aa363858 28VS 85 29 asp
  • 静态只读字段的初始化顺序[重复]

    这个问题在这里已经有答案了 我很好奇 C 规范对 C 5 net4 中静态字段的初始化顺序有何说明 例如 public class Test public static readonly string A hi public static
  • Pika:写入缓冲区超出警告

    我们的软件程序运行良好 5 个月 现在突然开始收到 Pika 警告 最终导致异常 Pika 0 9 5 用户警告 写入缓冲区超出警告阈值 我搜索了很多论坛 但都不满意 所描述的一种解决方案是完全忽略这些警告 但我对此有点怀疑 对此问题的任何
  • 从连续的数组切片或卷组成矩阵

    我有一个像这样的数组 10 20 30 40 我想建立一个矩阵M1像这样 10 0 0 0 20 10 0 0 30 20 10 0 40 30 20 10 我的方法是首先构建以下矩阵M2在数组的连续 卷 之外 10 20 30 40 20