16

同じサイズの2つのnumpy配列の行をインターリーブしたかったのです。私はこの解決策を思いついた。

# A and B are same-shaped arrays
A = numpy.ones((4,3))
B = numpy.zeros_like(A)
C = numpy.array(zip(A[::1], B[::1])).reshape(A.shape[0]*2, A.shape[1])
print(C)

出力

[[ 1.  1.  1.]
 [ 0.  0.  0.]
 [ 1.  1.  1.]
 [ 0.  0.  0.]
 [ 1.  1.  1.]
 [ 0.  0.  0.]
 [ 1.  1.  1.]
 [ 0.  0.  0.]]

よりクリーンで、より速く、より良い、しつこいだけの方法はありますか?

4

3 に答える 3

19

実行する方が少し明確かもしれません。

A = np.ones((4,3))
B = np.zeros_like(A)

C = np.empty((A.shape[0]+B.shape[0],A.shape[1]))

C[::2,:] = A
C[1::2,:] = B

おそらく少し速いと思います。

于 2012-10-12T14:44:00.313 に答える
5

スタック、転置、および形状変更が可能です。

numpy.dstack((A, B)).transpose(0, 2, 1).reshape(A.shape[0]*2, A.shape[1])
于 2012-10-12T14:40:03.370 に答える
5

numpy.hstack()私は非常に読みやすいものを使用して次のアプローチを見つけます:

import numpy as np

a = np.ones((2,3))
b = np.zeros_like(a)

c = np.hstack([a, b]).reshape(4, 3)

print(c)

出力:

[[ 1.  1.  1.]
 [ 0.  0.  0.]
 [ 1.  1.  1.]
 [ 0.  0.  0.]]

これを同じ形状の配列のリストに一般化するのは簡単です。

arrays = [a, b, c,...]

shape = (len(arrays)*a.shape[0], a.shape[1])

interleaved_array = np.hstack(arrays).reshape(shape)

小さい配列では@JoshAdelの受け入れられた答えよりも少し遅いようですが、大きい配列では同じくらい速いか速いです:

a = np.random.random((3,100))
b = np.random.random((3,100))

%%timeit
...: C = np.empty((a.shape[0]+b.shape[0],a.shape[1]))
...: C[::2,:] = a
...: C[1::2,:] = b
...:

The slowest run took 9.29 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 3.3 µs per loop

%timeit c = np.hstack([a,b]).reshape(2*a.shape[0], a.shape[1])
The slowest run took 5.06 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 10.1 µs per loop

a = np.random.random((4,1000000))
b = np.random.random((4,1000000))

%%timeit
...: C = np.empty((a.shape[0]+b.shape[0],a.shape[1]))
...: C[::2,:] = a
...: C[1::2,:] = b
...: 

10 loops, best of 3: 23.2 ms per loop

%timeit c = np.hstack([a,b]).reshape(2*a.shape[0], a.shape[1])
10 loops, best of 3: 21.3 ms per loop
于 2017-02-03T08:42:12.987 に答える