如何解决多次重复值,n在数组中
我有一个值的数组a
,其值在每个索引idx
上要重复b[idx]
次,在相同的索引{{1}中给出}放在另一个数组(idx
)中,例如:
b
所需的输出:
a = numpy.array([1,2,3,4,5])
b = numpy.array([2,1,4])
我意识到我可以做这样的事情:
c = numpy.array([1,5,5])
但是,循环不是一个好的选择,因为它很慢。 我将如何使其更快?也许是某种形式的矢量化。
解决方法
您正在寻找用于此目的的内置重复功能。只需将两个数组都输入到函数中即可:
np.repeat(a,b)
#[1 1 2 2 2 3 4 4 5 5 5 5]
,
根据对两个数组的了解,您可能会获得比本机提供的更多的性能:您知道在两个数组中可以出现哪种数字?您知道生成的数组将持续多长时间,以便您可以利用它并提前初始化该内存吗?
为说明这有什么不同,让我们看一下无需进一步操作即可从Numba中挤出的内容:
from numba import njit
import numpy as np
@njit
def f(a,b):
s = b.sum()
res = np.empty(s,dtype=np.int64)
cs = 0
for i in range(len(a)):
bi = b[i]
res[cs:cs+bi] = a[i]
cs += bi
return res
让我们使用IPython的魔力%timeit
来看看它与np.repeat(a,b)
的比较:
In [2]: a = np.random.randint(1,6,10000)
...: b = np.random.randint(1,10000)
In [3]: %timeit np.repeat(a,b)
135 µs ± 1.03 µs per loop (mean ± std. dev. of 7 runs,10000 loops each)
In [6]: %timeit f(a,b)
87 µs ± 485 ns per loop (mean ± std. dev. of 7 runs,10000 loops each)
所以这本身已经是一个不错的改进。现在,如果您事先知道b.sum()
是什么,则可以避免显式计算它,从而节省了一些时间。或者,如果您知道b
的值如何分布,则可以找出数组大小的上限,并在一天结束时截断res[:cs]
。
import numpy as np
import itertools
a = np.array([1,2,3,4,5])
b = np.array([2,1,4])
list(itertools.chain(*[[i[0]] * i[1] for i in zip(a,b)]))
,
<groupId>RestAssuredAPITesting_BDD_Project</groupId>
<artifactId>RestAssuredAPITesting_BDD_Project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>RestAssuredAPITesting_BDD_Project</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>2.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/io.rest-assured/json-schema-validator -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>4.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.rest-assured/json-path -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>4.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.rest-assured/xml-path -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>xml-path</artifactId>
<version>4.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.3.0</version>
<scope>test</scope>
</dependency>
</dependencies>
输出:
np.concatenate([np.repeat(a[i],b[i]) for i in range(len(a))])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。