Numpy 每行动态切片

2024-01-04

如何在不使用 for 循环的情况下动态地对给定开始和结束索引的每一行进行切片。我可以使用下面列出的循环来完成此操作,但是对于 x.shape[0] > 1 mill 的情况来说,它太慢了

x= np.arange(0,100)   
x = x.reshape(20,5)
s_idx = np.random.randint(0,3,x.shape[0])
e_idx = np.random.randint(3,6,x.shape[0])

print(s_idx)
>>> array([2, 1, 2, ..., 1, 0, 2])  

print(e_idx)
>>> array([3, 4, 5, ..., 3, 3, 3]) 

print(x)
>>> array([[ 0,  1,  2,  3,  4],
[ 5,  6,  7,  8,  9], 
[10, 11, 12, 13, 14], 
...,   
[85, 86, 87, 88, 89], 
[90, 91, 92, 93, 94], 
[95, 96, 97, 98, 99]])   

x_indexed = []
for idx,value in enumerate(s_idx):   
    x_indexed.append(x[idx][s_idx[idx]:e_idx[idx]])

print(x_indexed)
>>> [array([2]),
     array([6, 7, 8]),
     array([12, 13, 14]),
     array([15, 16, 17]),
     array([20, 21, 22, 23]),
     array([26, 27, 28, 29]),
     array([30, 31, 32, 33]),
     array([35, 36, 37, 38, 39]),
     array([40, 41, 42]),
     array([46, 47, 48]),
     array([52, 53, 54]),
     array([56, 57]),
     array([62, 63, 64]),
     array([67]),
     array([70, 71, 72, 73]),
     array([77]),
     array([80, 81, 82, 83, 84]),
     array([86, 87]),
     array([90, 91, 92]),
     array([97])]

您可以与屏蔽数组 https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html:

import numpy as np

np.random.seed(100)

x = np.arange(0, 100)
x = x.reshape(20, 5)
s_idx = np.random.randint(0, 3, x.shape[0])
e_idx = np.random.randint(3, 6, x.shape[0])

# This is optional, reduce x to the minimum possible block
first_col, last_col = s_idx.min(), e_idx.max()
x = x[:, first_col:last_col]
s_idx -= first_col
e_idx -= first_col

col_idx = np.arange(x.shape[1])
# Mask elements out of range
mask = (col_idx < s_idx[:, np.newaxis]) | (col_idx >= e_idx[:, np.newaxis])
x_masked = np.ma.array(x, mask=mask)
print(x_masked)

Output:

[[0 1 2 3 --]
 [5 6 7 8 9]
 [10 11 12 13 14]
 [-- -- 17 -- --]
 [-- -- 22 -- --]
 [25 26 27 28 --]
 [-- -- 32 33 --]
 [-- 36 37 38 --]
 [-- -- 42 -- --]
 [-- -- 47 -- --]
 [-- -- 52 53 --]
 [-- -- 57 58 --]
 [-- 61 62 63 --]
 [65 66 67 68 69]
 [70 71 72 -- --]
 [75 76 77 78 79]
 [80 81 82 83 --]
 [-- -- 87 88 --]
 [90 91 92 93 94]
 [-- 96 97 98 99]]

您可以使用屏蔽数组执行大多数 NumPy 操作,但如果您仍然想要数组列表,您可以执行以下操作:

list_arrays = [row[~m] for row, m in zip(x, x_masked.mask)]
print(list_arrays)

Output:

[array([0, 1, 2, 3]),
 array([5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14]),
 array([17]),
 array([22]),
 array([25, 26, 27, 28]),
 array([32, 33]),
 array([36, 37, 38]),
 array([42]),
 array([47]),
 array([52, 53]),
 array([57, 58]),
 array([61, 62, 63]),
 array([65, 66, 67, 68, 69]),
 array([70, 71, 72]),
 array([75, 76, 77, 78, 79]),
 array([80, 81, 82, 83]),
 array([87, 88]),
 array([90, 91, 92, 93, 94]),
 array([96, 97, 98, 99])]

尽管在这种情况下显然您不需要构造中间掩码数组,但您可以只迭代x and mask.

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

Numpy 每行动态切片 的相关文章

随机推荐

  • 自定义 MKAnnotation 标注视图?

    我有一个MKPointAnnotation let ann MKPointAnnotation self ann coordinate annLoc self ann title Customize me self ann subtitle
  • Oracle 将行转为列[重复]

    这个问题在这里已经有答案了 我有以下表格 TABLE1 id name 1 n1 2 n2 TABLE2 id tipo valor 1 t1 v1 1 t2 v2 2 t1 v1 2 t2 v5 2 t3 v3 我试图得到 id name
  • 如何在 Django JSONField 中过滤 JSON 数组

    我对在 Django 2 0 3 中过滤 postgres JSONField 感到疯狂 json 以数组形式存储 例如 tasks task test level 10 task test 123 level 20 我尝试过的 myMod
  • grails图像绝对路径

    我的标题模板中有这张图片 img src images slide 1 jpg alt width 175 height 77 当从 main 目录内的 gsp 文件使用模板时 将加载图像 不过 如果我在控制器内的 gsp 文件中使用相同的
  • ProcessBuilder调试

    我创建了一个可执行 jar 并使用另一个 java 程序的进程构建器执行它 这是我的代码 public class SomeClass public static void main String args Process p null P
  • VB.NET 相当于 C# 的 using 指令

    我正在将一些代码从 C 转换为 VB NET 并且我需要知道 C 的 using 指令的等效项是什么 Update 抱歉 但到目前为止我还没有得到答案 这是一个 C 示例 using moOutlook Microsoft Office I
  • 在 .NET MVC4 中调用本地 Web 服务时出现 HTTP 404 错误

    我正在尝试学习 NET mvc4 中的 Web 服务 我尝试创建一个新的 Internet 应用程序并向该项目添加一个 Web 服务 asmx 默认情况下 VS 添加一个 HelloWorld Web 服务 当我尝试在浏览器中运行它时 我确
  • jasmine需要sinon.js吗?

    我在网上看到过人们使用的例子jasmine http pivotal github com jasmine 和 一起sinon http sinonjs org 然而 茉莉支持间谍 据我所知 诗乃就是这么做的 那么问题来了 诗浓在使用茉莉花
  • 由于 COMMAND_LINE_LOGGING_LEVEL 原因,无法导入 Markdown

    我遇到了一个奇怪的错误 我可以在 Python 中导入 markdown 并且可以在 Django runserver 内的 python 中导入 markdown 但是当尝试在 Gunicorn 的应用程序服务器内导入 markdown
  • 找不到网络浏览器:无法找到可运行的浏览器。 Jupyter笔记本

    Jupyter notebook 无法打开网络浏览器 之前用的好好的 后来windows 10提示更新后就开始在Microsoft Edge中打开了 当我尝试将其更改为默认浏览器 chrome 时 它根本无法打开 我跟着如何在 Window
  • 用于 Excel 克隆的正确数据结构

    假设我正在使用 C 开发 Excel 克隆 我的网格表示如下 private struct CellValue private int column private int row private string text private L
  • 如何卸载 Perl 模块?

    我在我的 Linux 机器上安装了一些 Perl 模块 如果我输入perldoc perllocal它显示了我的机器中安装的 Perl 模块的列表 但现在我不需要这些 Perl 模块 所以我想删除它们 有谁知道如何卸载或删除Linux de
  • PHP - 比较两个多维数组

    我有两个包含数据的数组 我需要比较这两个数组并创建一个最终数组 这是我的情况 grab a list of the folders folders glob GLOB ONLYDIR create empty array s which w
  • 重试 Visual Studio C# 测试方法

    我很好奇是否有任何内置机制可以retry在 Visual Studio 2008 C 单元测试框架中进行测试 举个例子 我有一个 C 单元测试 如下所示 TestMethod public void MyMethod DoSomething
  • 从一个 dagger 2 模块如何访问另一个 dagger 2 模块中提供的 SharedPreferences

    从一个 dagger2 模块提供 SharedPreferences 后 在另一个 dagger2 模块中想要使用它 怎么做 下面的代码似乎不起作用 组件 Singleton Component modules arrayOf DataMa
  • Redis 6 可以利用多核 CPU 的优势吗?

    Since Redis 6支持多线程IO https redislabs com blog diving into redis 6 在超过2个核心的机器上部署Redis有意义吗 它是否能够利用额外的核心 或者 2 个核心仍然是理想的选择 一
  • 计算阿克曼函数的较大值

    我有一些代码 int CalculateAckermann int x int y if x return y if y return CalculateAckermann x 1 else return CalculateAckerman
  • 返回 Fortran 中不同长度的字符串数组

    我想创建一个类型来包含 Fortran 中的字符串数组 而无需显式分配长度 以便我可以从函数返回它 以下是我的类型 type returnArr Character dimension 4 array end type returnArr
  • 由于 JSON 中转义的单引号,jQuery.parseJSON 抛出“无效 JSON”错误

    我正在使用以下方式向我的服务器发出请求jQuery post 我的服务器正在返回 JSON 对象 例如 var value 但是 如果任何值包含单引号 正确转义 如 jQuery 无法解析有效的 JSON 字符串 这是我的意思的一个例子 在
  • Numpy 每行动态切片

    如何在不使用 for 循环的情况下动态地对给定开始和结束索引的每一行进行切片 我可以使用下面列出的循环来完成此操作 但是对于 x shape 0 gt 1 mill 的情况来说 它太慢了 x np arange 0 100 x x resh