Ami*_*mir 4 python arrays numpy
假设a = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]和s = [3, 3, 9, 3, 6, 3].我在寻找重复的最佳方式a[i]正好s[i]次,然后在形式的扁平化阵列b = [0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.3, ... ].
我想尽快做到这一点,因为我必须多次这样做.我正在使用Python和numpy,数组被定义为numpy.ndarray.我四处搜索并了解了哪些repeat,tile并且column_stack可以很好地使用它来重复每个元素n次,但我想重复它们中的每一个不同的时间.
一种方法是:
a = hsplit(a, 6)
for i in range(len(a)):
a[i] = repeat(a[i], s[i])
a = a.flatten()
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来做到这一点.
Ash*_*ary 12
这正是numpy.repeat:
>>> a = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
>>> s = np.array([3, 3, 9, 3, 6, 3])
>>> np.repeat(a, s)
array([ 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.3, 0.3,
0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.5,
0.5, 0.5, 0.6, 0.6, 0.6])
Run Code Online (Sandbox Code Playgroud)
在纯Python中,您可以执行以下操作:
>>> from itertools import repeat, chain, imap
>>> list(chain.from_iterable(imap(repeat, a, s)))
[0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.6, 0.6, 0.6]
Run Code Online (Sandbox Code Playgroud)
但当然它会比它的NumPy等效速度慢:
>>> s = [3, 3, 9, 3, 6, 3]*1000
>>> a = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]*1000
>>> %timeit list(chain.from_iterable(imap(repeat, a, s)))
1000 loops, best of 3: 1.21 ms per loop
>>> %timeit np.repeat(a_a, s_a) #a_a and s_a are NumPy arrays of same size as a and b
10000 loops, best of 3: 202 µs per loop
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1478 次 |
| 最近记录: |