python - 用 numpy 重复排列

标签 python numpy repeat

我有一个包含整数值的数组。

a = [2,1,4,0,2]

我想对 a 中的每个值应用 arange 函数以便拥有:

b = [0,1,0,0,1,2,3,1,2]
b "=" [arange(2),arange(1),arange(4),arange(0),arange(2)] 

事实上,我使用一个np.repeat函数来根据数组a重复数组行,我希望有一个标记i来将每个重复的值链接到原始值,并有一个标识号来区分它们。

我尝试使用 np.vectorize 但没有成功。

最佳答案

肯定有更多的 numpythonic 做事方式。一种可能是这样的:

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

def concatenated_ranges(ranges_list) :
    ranges_list = np.array(ranges_list, copy=False)
    base_range = np.arange(ranges_list.max())
    base_range =  as_strided(base_range,
                             shape=ranges_list.shape + base_range.shape,
                             strides=(0,) + base_range.strides)
    return base_range[base_range < ranges_list[:, None]]

如果您只连接几个范围,那么 E 先生的纯 Python 解决方案可能是您的最佳选择,但如果您要连接的范围甚至只有一百个,这个 stars 速度明显更快。为了比较,我使用了从其他答案中提取的这两个函数:

def junuxx(a) :
    b = np.array([], dtype=np.uint8)
    for x in a:
        b = np.append(b, np.arange(x))
    return b

def mr_e(a) :
    return reduce(lambda x, y: x + range(y), a, [])

下面是一些时间安排:

In [2]: a = [2, 1, 4, 0 ,2] # the OP's original example

In [3]: concatenated_ranges(a) # show it works!
Out[3]: array([0, 1, 0, 0, 1, 2, 3, 0, 1])

In [4]: %timeit concatenated_ranges(a)
10000 loops, best of 3: 31.6 us per loop

In [5]: %timeit junuxx(a)
10000 loops, best of 3: 34 us per loop

In [6]: %timeit mr_e(a)
100000 loops, best of 3: 2.58 us per loop

In [7]: a = np.random.randint(1, 10, size=(10,))

In [8]: %timeit concatenated_ranges(a)
10000 loops, best of 3: 27.1 us per loop

In [9]: %timeit junuxx(a)
10000 loops, best of 3: 79.8 us per loop

In [10]: %timeit mr_e(a)
100000 loops, best of 3: 7.82 us per loop

In [11]: a = np.random.randint(1, 10, size=(100,))

In [12]: %timeit concatenated_ranges(a)
10000 loops, best of 3: 57.4 us per loop

In [13]: %timeit junuxx(a)
1000 loops, best of 3: 756 us per loop

In [14]: %timeit mr_e(a)
10000 loops, best of 3: 149 us per loop

In [15]: a = np.random.randint(1, 10, size=(1000,))

In [16]: %timeit concatenated_ranges(a)
1000 loops, best of 3: 358 us per loop

In [17]: %timeit junuxx(a)
100 loops, best of 3: 9.38 ms per loop

In [18]: %timeit mr_e(a)
100 loops, best of 3: 8.93 ms per loop

关于python - 用 numpy 重复排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15089310/

相关文章:

configuration - 有没有办法将 dbx 配置为将空白命令视为上一个命令的重复?

css - 背景不显示在 repeat-y

python - 如何将整数添加到列表中的每个元素?

python - 按日期统计组数

在 R 中使用循环重复值

python structured/recarray 类型转换行为

python - 在 Cython 中访问 NumPy 记录数组列

python - 从 fixture 内部跳过测试

python - 如何将 Perlin 噪声值标准化到范围 [0, 1]?

python - 3D 数据的最佳数据结构?