2013-08-21 96 views
10

Tôi muốn tạo ra một mảng NumPy 2D nơi tôi muốn để lưu trữ các tọa độ của các điểm ảnh như vậy mà mảng NumPy trông như thế nàyphương pháp nhanh nhất để tạo ra mảng 2D NumPy có yếu tố nằm trong phạm vi

[(0, 0), (0, 1), (0, 2), ...., (0, 510), (0, 511) 
(1, 0), (1, 1), (1, 2), ...., (1, 510), (1, 511) 
.. 
.. 
.. 
(511, 0), (511, 1), (511, 2), ...., (511, 510), (511, 511)] 

Đây là một câu hỏi ngớ ngẩn nhưng tôi không thể tìm thấy bất cứ điều gì được nêu ra.

+0

Cách bạn định dạng, có vẻ như bạn muốn một mảng 3D có hình dạng (512, 512, 2) ... nhưng đánh dấu cú pháp bạn đã đưa ra là cho một mảng 2D có hình dạng (512 * 512, 2). Bạn có thể làm rõ? – lmjohns3

Trả lời

7

có thể sử dụng np.indices hoặc np.meshgrid để biết thêm indexing tiên tiến:

>>> data=np.indices((512,512)).swapaxes(0,2).swapaxes(0,1) 
>>> data.shape 
(512, 512, 2) 

>>> data[5,0] 
array([5, 0]) 
>>> data[5,25] 
array([ 5, 25]) 

này có thể trông lẻ vì nó thực sự làm để làm một cái gì đó như thế này:

>>> a=np.ones((3,3)) 
>>> ind=np.indices((2,1)) 
>>> a[ind[0],ind[1]]=0 
>>> a 
array([[ 0., 1., 1.], 
     [ 0., 1., 1.], 
     [ 1., 1., 1.]]) 

Một ví dụ mgrid:

np.mgrid[0:512,0:512].swapaxes(0,2).swapaxes(0,1) 

Ví dụ về lưới mesh:

>>> a=np.arange(0,512) 
>>> x,y=np.meshgrid(a,a) 
>>> ind=np.dstack((y,x)) 
>>> ind.shape 
(512, 512, 2) 

>>> ind[5,0] 
array([5, 0]) 

Tất cả các cách tương đương để thực hiện việc này; tuy nhiên, meshgrid có thể được sử dụng để tạo lưới không đồng nhất.

Nếu bạn không nhớ chuyển đổi chỉ mục hàng/cột, bạn có thể hủy số swapaxes(0,1) cuối cùng.

2

Bạn có thể sử dụng np.ogrid tại đây. Thay vì lưu trữ tuple, lưu trữ nó trong một mảng 3D.

>>> t_row, t_col = np.ogrid[0:512, 0:512] 
>>> a = np.zeros((512, 512, 2), dtype=np.uint8) 
>>> t_row, t_col = np.ogrid[0:512, 0:512] 
>>> a[t_row, t_col, 0] = t_row 
>>> a[t_row, t_col, 1] = t_col 

Điều này cần thực hiện thủ thuật. Hy vọng rằng bạn có thể sử dụng điều này, thay vì tuple.

Chintak

3

Ví dụ trong câu hỏi không hoàn toàn rõ ràng - dấu phẩy thừa bị thiếu hoặc thêm bộ đệm.

một này - ví dụ khoảng 3, 4 cho rõ ràng - cung cấp giải pháp cho các biến thể đầu tiên và tạo ra một mảng 2D có hiệu lực (như tiêu đề câu hỏi gợi ý) - "danh sách" tất cả các tọa độ:

>>> np.indices((3,4)).reshape(2,-1).T 
array([[0, 0], 
     [0, 1], 
     [0, 2], 
     [0, 3], 
     [1, 0], 
     [1, 1], 
     [1, 2], 
     [1, 3], 
     [2, 0], 
     [2, 1], 
     [2, 2], 
     [2, 3]]) 

các biến thể khác đã được thể hiện trong câu trả lời khác bằng cách sử dụng 2x .swapaxes() - nhưng nó cũng có thể được thực hiện với một np.rollaxis() (hoặc mới np.moveaxis()):

>>> np.rollaxis(np.indices((3,4)), 0, 2+1) 
array([[[0, 0], 
     [0, 1], 
     [0, 2], 
     [0, 3]], 

     [[1, 0], 
     [1, 1], 
     [1, 2], 
     [1, 3]], 

     [[2, 0], 
     [2, 1], 
     [2, 2], 
     [2, 3]]]) 
>>> _[0,1] 
array([0, 1]) 

Phương pháp này cũng hoạt động tương tự đối với các chỉ số N-chiều, ví dụ .:

>>> np.rollaxis(np.indices((5,6,7)), 0, 3+1) 

Lưu ý: Chức năng np.indices làm việc thực sự (C-tốc độ) nhanh chóng cho các phạm vi lớn.