python索引 自定义_python – 使用多个自定义索引范围构建numpy数组,而不显式循环...

在Numpy中,是否有一种pythonic方法来创建array3,其中自定义范围来自array1和array2而没有循环?迭代范围的直接解决方案有效,但由于我的数组遇到了数百万个项目,我正在寻找更有效的解决方案(也可能是语法糖).

例如,

array1 = np.array([10, 65, 200])

array2 = np.array([14, 70, 204])

array3 = np.concatenate([np.arange(array1[i], array2[i]) for i in

np.arange(0,len(array1))])

print array3

结果:[10,11,12,13,65,66,67,68,69,200,201,202,203].

解决方法:

前瞻性方法

我将回顾如何解决这个问题.

采取问题中列出的样本.我们有 –

array1 = np.array([10, 65, 200])

array2 = np.array([14, 70, 204])

现在,看看想要的结果 –

result: [10,11,12,13,65,66,67,68,69,200,201,202,203]

让我们计算组长度,因为我们需要那些解释下一步的解决方案.

In [58]: lens = array2 - array1

In [59]: lens

Out[59]: array([4, 5, 4])

我们的想法是使用1的初始化数组,当在整个长度上进行累积求和时,可以得到所需的结果.

这个累积总和将是我们解决方案的最后一步.

为什么1的初始化?好吧,因为我们有一个数组以1的步长增加,除了在我们有变化的特定地方

对应新的团体进来.

现在,因为cumsum将是最后一步,所以它之前的步骤应该给我们一些像 –

array([ 10, 1, 1, 1, 52, 1, 1, 1, 1, 131, 1, 1, 1])

正如前面所讨论的那样,在特定的地方,它的1是[10,52,131].那个10似乎是从array1中的第一个元素进来的,但其余的呢?

第二个52以65-13(看结果)进入,其中13个进入了以10开头并且因为长度而跑的组

第一组4.所以,如果我们做65 – 10 – 4,我们将获得51然后加1以适应边界停止,我们将有52,这是

期望的转移价值.同样,我们会得到131.

因此,可以像这样计算那些移位值 –

In [62]: np.diff(array1) - lens[:-1]+1

Out[62]: array([ 52, 131])

接下来,为了获得发生这种转变的那些转移位置,我们可以简单地对组长度进行累积求和 –

In [65]: lens[:-1].cumsum()

Out[65]: array([4, 9])

为了完整性,我们需要为移位值预先附加0,使用array1 [0]作为移位值.

因此,我们将逐步展示我们的方法!

把它们放回去

1]获取每组的长度:

lens = array2 - array1

2]获取发生偏移的索引和要放入1的初始化数组中的值:

shift_idx = np.hstack((0,lens[:-1].cumsum()))

shift_vals = np.hstack((array1[0],np.diff(array1) - lens[:-1]+1))

3] Setup 1的初始化ID数组,用于将这些值插入前面步骤中列出的那些索引:

id_arr = np.ones(lens.sum(),dtype=array1.dtype)

id_arr[shift_idx] = shift_vals

4]最后对ID数组进行累加求和:

output = id_arr.cumsum()

以功能格式列出,我们会 –

def using_ones_cumsum(array1, array2):

lens = array2 - array1

shift_idx = np.hstack((0,lens[:-1].cumsum()))

shift_vals = np.hstack((array1[0],np.diff(array1) - lens[:-1]+1))

id_arr = np.ones(lens.sum(),dtype=array1.dtype)

id_arr[shift_idx] = shift_vals

return id_arr.cumsum()

它也适用于重叠范围!

In [67]: array1 = np.array([10, 11, 200])

...: array2 = np.array([14, 18, 204])

...:

In [68]: using_ones_cumsum(array1, array2)

Out[68]:

array([ 10, 11, 12, 13, 11, 12, 13, 14, 15, 16, 17, 200, 201,

202, 203])

运行时测试

让我们来讨论@unutbu's flatnonzero based solution中针对其他矢量化方法的提议方法,这种方法已经证明比循环方法好得多 –

In [38]: array1, array2 = (np.random.choice(range(1, 11), size=10**4, replace=True)

...: .cumsum().reshape(2, -1, order='F'))

In [39]: %timeit using_flatnonzero(array1, array2)

1000 loops, best of 3: 889 µs per loop

In [40]: %timeit using_ones_cumsum(array1, array2)

1000 loops, best of 3: 235 µs per loop

改进!

现在,代码NumPy不喜欢追加.因此,对于稍微改进的版本,可以避免那些np.hstack调用,如下所示 –

def get_ranges_arr(starts,ends):

counts = ends - starts

counts_csum = counts.cumsum()

id_arr = np.ones(counts_csum[-1],dtype=int)

id_arr[0] = starts[0]

id_arr[counts_csum[:-1]] = starts[1:] - ends[:-1] + 1

return id_arr.cumsum()

让我们反对我们原来的做法 –

In [151]: array1,array2 = (np.random.choice(range(1, 11),size=10**4, replace=True)\

...: .cumsum().reshape(2, -1, order='F'))

In [152]: %timeit using_ones_cumsum(array1, array2)

1000 loops, best of 3: 276 µs per loop

In [153]: %timeit get_ranges_arr(array1, array2)

10000 loops, best of 3: 193 µs per loop

所以,我们的性能提升了30%!

标签:python,arrays,vectorization,numpy,performance

来源: https://codeday.me/bug/20190611/1219579.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kata_Java中的功能性FizzBu​​zz Kata

kata不久前,我使用Java 8流和lambda解决了FizzBu​​zz kata问题。 尽管最终结果是可行的,但中间步骤却没有。 我当然可以做得更好。 与往常一样,让我们​​从失败的测试开始: package remonsinnema.blog.fizzbuzz;import stati…

C++ 【随想录】(三)源文件编译流程,静态库与动态库编译

预处理 : 完成宏替换,文件引入;以及去除空行,注释等,为下一步编译做准备。也就是对各种预处理命令进行处理,包括头文件的包含,宏定义扩展,条件编译的选择。 gcc -E test.c -o test…

python字典查询多个值_python – 在Pandas Dataframe中查找多个字典键并返回多个匹配值...

如果我的格式化关闭,第一次发布如此道歉.这是我的问题:我创建了一个包含多行文本的Pandas数据框:d {keywords :[cheap shoes, luxury shoes, cheap hiking shoes]}keywords pd.DataFrame(d,columns[keywords])In [7]: keywordsOut[7]:keywords0 cheap …

hibernate jpa_使用Hibernate(JPA)一键式删除

hibernate jpa在旧版本的Hibernate中,我可以看到手册中指示的一键式删除 。 但是较新的版本不再包含此部分。 我不知道为什么。 因此,在这篇文章中,我来看看它是否仍然有效。 一键式删除部分显示: 有时一个接一个地删除收集元素…

python测试开发实战_《python测试开发实战》基于pytest基础部分实例1-Hello

要求实现如下命令行接口python 1hello.py -husage: 1hello.py [-h] [-n NAME]Say hellooptional arguments:-h, --help show this help message and exit-n NAME, --name NAME Name to greet没有参数时输出Hello, World!$python 1hello.pyHello, World!有参数时输出Hello, 人名…

kafka 发布订阅_在Kafka中发布订阅模型

kafka 发布订阅这是第四个柱中的一系列关于同步客户端集成与异步系统( 1, 2, 3 )。 在这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现。 卡夫卡概念 根据官方文件 : Kafka是…

python socket recvfrom_Python socket学习笔记(一)

最近在看 Python的视频,针对socket 编程做一个笔记一、socket是什么?socket 通常也称为“套接字”,用于描述 IP 地址和端口,是一个通讯链的句柄。应用程序通常通过 “套接字”向网络发出请求或者应答网络请求。说白了,…

dynamodb java_使用Java更新DynamoDB项

dynamodb java在上一篇文章中&#xff0c;我们继续使用Java将项目插入DynamoDB。 DynamoDB还支持更新项目。 我们将使用Login表获取更新示例。 发布更新时&#xff0c;必须指定要更新的项目的主键。 public void updateName(String email,String fullName) {Map<String,A…

apache camel_使用Apache Camel进行负载平衡

apache camel在此示例中&#xff0c;我们将向您展示如何使用Apache Camel作为系统的负载平衡器。 在计算机世界中&#xff0c;负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备。 负载平衡器用于增加容量&#xff08;并发用户&#xff09;和应用程…

lombok 自动使用_Lombok,自动值和不可变项

lombok 自动使用我喜欢布兰登&#xff08;Brandon &#xff09;在博客文章中比较Project Lombok &#xff0c; AutoValue和Immutables的建议 &#xff0c;而这篇文章试图做到这一点。 我已经简要概述了Project Lombok &#xff0c; AutoValue和Immutables &#xff0c;但是这篇…

邮箱批量登录接验证码_记一次莫名的需求(临时邮箱|企业邮箱)

目录&#xff1a;前言行情伪需求过程1.前戏2.买域名3.网易企业邮箱4.模糊的需求5.晚饭后6.临时邮箱16.临时邮箱27.域名版临时邮箱8.遇见问题8.1.DNSPOD8.2.换种思路拓展1.思路2.后续2.1.简单2.2.自建临时邮箱后话记一次需求不明的亏看完这篇文章你会学到&#xff1a; 免费企业邮…

【四】初步预测

import time from lxml import etree from collections import defaultdict import math import requests from matplotlib import pyplot as plt import pandas as pd import datetimed = defaultdict(list) listp = list()# 90+进球球队 setp = set()Allset = set()def httpg…

java 补充日期_Java 9对可选的补充

java 补充日期哇&#xff0c;人们真的对Java 9对Stream API的添加感兴趣。 想要更多&#xff1f; 让我们看一下…… 可选的 可选::流 无需解释&#xff1a; Stream<T> stream();想到的第一个词是&#xff1a; 终于 &#xff01; 最后&#xff0c;我们可以轻松地从可选…

msf如何升级_Kali linux 2016.2(Rolling)中的Metasploit如何更新与目录结构初步认识...

如何更新MSF1、Windows平台方法1&#xff1a;运行msfupdate.bat在msfconsole里执行命令svn update或者方法2&#xff1a;2、unix/linux平台方法1&#xff1a;运行msfupdate即可。方法2&#xff1a;(比较麻烦)安装subversion客户端(--with-ssl)&#xff0c;之后连接CVS server进…

【五】每个球队胜率统计

import time from lxml import etree from collections import defaultdict import math import requests from matplotlib import pyplot as plt import pandas as pd import datetimed = defaultdict(list) listp = list()# 近七天比赛所有球队 listall = list()# 近七天所有…

jaxb注解使用_使用JAXB的简介

jaxb注解使用我正在将一些依赖于Apache XMLBeans的模块迁移到JAXB。 这是令人兴奋和充满挑战的几天。 我想记下我遇到的一些重要事情&#xff0c;以供将来可能会发现有用的任何人使用。 首先&#xff0c;让我们来看一下设置用于JAXB代码生成的maven插件。 在撰写本文时&#x…

离散信号的抽取和内插例题_信号与系统例题分析

第1章 信号及其基本运算1.1 内容要点1.2 公式摘要1.3 例题分析例1.1 连续时间信号与波形例1.2 离散时间信号与波形例1.3 信号的积分运算例1.4 单位冲激信号的筛选特性例1.5 信号的平移例1.6 信号的求和、积分运算例1.7 卷积的两种计算方法例1.8 卷积的位移特性例1.9 卷积概念的…

dynamodb java_使用Java扫描DynamoDB项目

dynamodb java在之前的文章中&#xff0c;我们介绍了如何查询DynamoDB数据库 查询DynamoDB第1部分 查询DynamoDB第2部分 。 除了发出查询之外&#xff0c;DynamoDB还提供扫描功能。 扫描所做的是获取您在DynamoDB表上可能拥有的所有项目。 因此&#xff0c;扫描不需要任何基…

【Python科学计算系列】行列式

1.二元线性方程组求解 import numpy as np a np.array([[3, -2], [2, 1]]) b np.array([12, 1]) d np.linalg.solve(a, b) print(d) 2.三阶行列式求值 import numpy as np a np.array([[1, 2, -4], [-2, 2, 1], [-3, 4, -2]]) d np.linalg.det(a) print(d) 3.行列式的余…

python写的hadoop实战_Hadoop实战

Hadoop实战1 Hadoop简介1.1 什么是Hadoop1.1.1 Hadoop概述1.1.2 Hadoop的历史1.1.3 Hadoop的功能与作用1.1.4 Hadoop的优势1.1.5 Hadoop的应用现状和发展趋势1.2 Hadoop项目及其结构1.3 Hadoop的体系结构1.3.1 HDFS的体系结构1.3.2 MapReduce的体系结构1.4 Hadoop与分布式开发1…