65

R関数rep()は、ベクトルの各要素を複製します。

> rep(c("A","B"), times=2)
[1] "A" "B" "A" "B"

これは、Pythonでのリストの乗算に似ています。

>>> ["A","B"]*2
['A', 'B', 'A', 'B']

ただし、rep()R関数を使用すると、ベクトルの各要素の繰り返し数を指定することもできます。

> rep(c("A","B"), times=c(2,3))
[1] "A" "A" "B" "B" "B"

Pythonでそのような関数を利用できますか?そうでなければ、どのようにそれを定義することができますか?ちなみに、配列の行を複製するためのこのような関数にも興味があります。

4

8 に答える 8

70

numpy配列とnumpy.repeat関数を使用します。

import numpy as np

x = np.array(["A", "B"])
print np.repeat(x, [2, 3], axis=0)

['A' 'A' 'B' 'B' 'B']
于 2012-09-02T11:34:44.047 に答える
10

これに使用できるビルトインがあるかどうかはわかりませんが、次のようなものを試すことができます。

>>> lis = ["A", "B"]
>>> times = (2, 3)
>>> sum(([x]*y for x,y in zip(lis, times)),[])
['A', 'A', 'B', 'B', 'B']

sum()二次時間で実行されることに注意してください。したがって、これは推奨される方法ではありません。

>>> from itertools import chain, izip, starmap
>>> from operator import mul
>>> list(chain.from_iterable(starmap(mul, izip(lis, times))))
['A', 'A', 'B', 'B', 'B']

タイミングの比較:

>>> lis = ["A", "B"] * 1000
>>> times = (2, 3) * 1000
>>> %timeit list(chain.from_iterable(starmap(mul, izip(lis, times))))
1000 loops, best of 3: 713 µs per loop
>>> %timeit sum(([x]*y for x,y in zip(lis, times)),[])
100 loops, best of 3: 15.4 ms per loop
于 2012-09-02T11:31:59.617 に答える
5

「配列」と言ってRに言及しているので、とにかくnumpy配列を使用してから、次を使用することをお勧めします。

import numpy as np
np.repeat(np.array([1,2]), [2,3])

編集:あなたはあなたも行を繰り返したいと言っているので、私はあなたがnumpyを使うべきだと思います。np.repeatこれを行うための軸引数があります。

それ以外の場合、多分:

from itertools import izip, chain, repeat
list(chain(*(repeat(a,b) for a, b in izip([1,2], [2,3]))))

それはあなたが乗算するリストまたは文字列を持っているという仮定をしていないので。私は認めますが、すべてを引数としてチェーンに渡すことは完全ではない可能性があるため、独自のイテレータを作成する方がよい場合があります。

于 2012-09-02T11:37:02.967 に答える
3
l = ['A','B']
n = [2, 4]

あなたの例では、すでに反復可能な文字列を使用しています。リストに似た結果文字列を生成できます。

''.join([e * m for e, m in zip(l, n)])
'AABBBB'

更新:ここではリスト内包表記は必要ありません:

''.join(e * m for e, m in zip(l, n))
'AABBBB'
于 2012-09-02T11:33:22.157 に答える