NumPy của ndindex()
công trình cho ví dụ bạn đưa ra, nhưng nó không phục vụ cho tất cả các trường hợp sử dụng. Không giống như của Python được xây dựng trong range()
, cho phép cả một tùy ý start
, stop
và step
, của numpy np.ndindex()
chỉ chấp nhận một stop
. (Các start
được coi là (0,0,...)
, và step
là (1,1,...)
.)
Dưới đây là một thực hiện đóng vai trò giống như được xây dựng trong range()
chức năng. Tức là, nó cho phép các đối số start
/stop
/step
tùy ý, nhưng nó hoạt động trên tuples thay vì chỉ các số nguyên.
import sys
from itertools import product, starmap
# Python 2/3 compatibility
if sys.version_info.major < 3:
from itertools import izip
else:
izip = zip
xrange = range
def ndrange(start, stop=None, step=None):
if stop is None:
stop = start
start = (0,)*len(stop)
if step is None:
step = (1,)*len(stop)
assert len(start) == len(stop) == len(step)
for index in product(*starmap(xrange, izip(start, stop, step))):
yield index
Ví dụ:
In [7]: for index in ndrange((1,2,3), (10,20,30), step=(5,10,15)):
...: print(index)
...:
(1, 2, 3)
(1, 2, 18)
(1, 12, 3)
(1, 12, 18)
(6, 2, 3)
(6, 2, 18)
(6, 12, 3)
(6, 12, 18)
+1: Cú pháp cho điều đó tương tự đáng báo động với những gì OP ban đầu được yêu cầu. Vâng chơi! –
Vì Li-aung đã chỉ ra điều này khá giống với những gì tôi yêu cầu, nên chắc chắn đó là câu trả lời hay nhất cho chủ đề. – MaiaVictor
Câu trả lời của Li-aung Yip cũng rất tuyệt, và có một số học hỏi về nó vì nó cho thấy sản phẩm Descartes có thể được sử dụng cho cùng một mục đích. – MaiaVictor