2011-10-05 39 views
9

Tôi muốn lặp lại các yếu tố của một mảng dọc theo trục 0 và trục 1 cho M và N lần lượt là:Làm thế nào để lặp lại các phần tử của một mảng dọc theo hai trục?

import numpy as np 

a = np.arange(12).reshape(3, 4) 
b = a.repeat(2, 0).repeat(2, 1) 
print(b) 

[[ 0 0 1 1 2 2 3 3] 
[ 0 0 1 1 2 2 3 3] 
[ 4 4 5 5 6 6 7 7] 
[ 4 4 5 5 6 6 7 7] 
[ 8 8 9 9 10 10 11 11] 
[ 8 8 9 9 10 10 11 11]] 

này hoạt động, nhưng tôi muốn biết được có phương pháp tốt hơn mà không tạo ra một mảng tạm thời.

+1

Đồng thời xem câu trả lời được cung cấp trên [bài đăng này] (http://stackoverflow.com/q/32846846/2566083) bằng cách sử dụng kron, repeat và stride_tricks cùng với phân tích tốc độ. – mlh3789

Trả lời

6

Bạn có thể sử dụng sản phẩm Kronecker, xem numpy.kron:

>>> a = np.arange(12).reshape(3,4) 
>>> print np.kron(a, np.ones((2,2), dtype=a.dtype)) 
[[ 0 0 1 1 2 2 3 3] 
[ 0 0 1 1 2 2 3 3] 
[ 4 4 5 5 6 6 7 7] 
[ 4 4 5 5 6 6 7 7] 
[ 8 8 9 9 10 10 11 11] 
[ 8 8 9 9 10 10 11 11]] 

phương pháp ban đầu của bạn là OK quá, mặc dù!

2

Một giải pháp khác là sử dụng as_strided. kron chậm hơn nhiều khi sử dụng repeat hai lần. Tôi đã thấy rằng as_strided nhanh hơn nhiều so với một đôi repeat trong nhiều trường hợp (các mảng nhỏ [< 250x250] chỉ với một gấp đôi trong mỗi thứ nguyên as_strided là chậm hơn). Bí quyết as_strided là như sau:

a = arange(1000000).reshape((1000, 1000)) # dummy data 

from numpy.lib.stride_tricks import as_strided 
N, M = 4,3 # number of time to replicate each point in each dimension 
H, W = a.shape 
b = as_strided(a, (H, N, W, M), (a.strides[0], 0, a.strides[1], 0)).reshape((H*N, W*M)) 

này hoạt động bằng cách sử dụng những bước tiến 0-chiều dài gây NumPy đọc cùng một giá trị nhiều lần (cho đến khi nó được cho là yếu tố tiếp theo). Cuối cùng reshape sao chép dữ liệu, nhưng chỉ một lần không giống như sử dụng một đôi repeat sẽ sao chép dữ liệu hai lần.

+1

[Đây là liên kết] (https://stackoverflow.com/a/32848377/3923281) đến giải pháp nơi 'as_strided' đã được đề xuất, cùng với thời gian ;-) –

Các vấn đề liên quan