【发布时间】:2020-09-22 06:59:58
【问题描述】:
Numpy 的 arange 仅接受单个标量值用于开始/停止/步骤。这个功能有多个版本吗?哪个可以接受开始/停止/步进的数组输入?例如。输入二维数组,如:
[[1 5 1], # start/stop/step first
[3 8 2]] # start/stop/step second
应该为每一行输入(每个开始/停止/步骤)创建一个由一系列连接组成的数组,上面的输入应该创建一维数组
1 2 3 4 3 5 7
即我们需要设计它接下来要执行的功能:
print(np.multi_arange(np.array([[1,5,1],[3,8,2]])))
# prints:
# array([1, 2, 3, 4, 3, 5, 7])
而且这个函数应该是高效的(纯 numpy),即非常快速地处理形状为 (10000, 3) 的输入数组,无需纯 Python 循环。
当然可以创建纯 Python 的循环(或 listcomp)来为每一行创建一个范围并连接此循环的结果。但是我有很多行包含三元组开始/停止/步骤,需要高效快速的代码,因此寻找纯 numpy 函数。
我为什么需要它。我需要这个来完成几个任务。其中之一是用于索引 - 假设我有 1D 数组 a 并且我需要提取该数组的许多(可能相交的)子范围。如果我有多个版本的 arange 我会这样做:
values = a[np.multi_arange(starts_stops_steps)]
也许可以使用 numpy 函数的某些组合来创建多范围函数?你能推荐吗?
对于提取一维数组的子范围(参见上面的最后一行代码)而不使用 multi_arange 创建所有索引的特定情况,也许还有一些更有效的解决方案?
【问题讨论】:
-
试图了解数据集 - 步长值的最小值和最大值是多少?
-
@Divakar start, stop, step 可以是任意数字,没有最小值或最大值,与
np.arange()接受的相同,现在可能只是整数(以后可能会浮动)。 -
@Divakar 您可以针对总有数千个三元组启动/停止/步骤的情况优化您的解决方案,而不仅仅是少数。
标签: python arrays performance numpy vectorization