2013-05-20 23 views
7

Xem xét một đặc điểm kỹ thuật của numpy mảng, điển hình để xác định matplotlib âm mưu dữ liệu:Lặp lại hai mảng, không có dấu gạch ngang, ở dạng numpy?

t = np.arange(0.0,1.5,0.25) 
s = np.sin(2*np.pi*t) 

Về cơ bản, điều này có lưu trữ các x tọa độ của (x,y) điểm dữ liệu của chúng tôi trong mảng t; và các tọa độ kết quả y (kết quả của y = f (x), trong trường hợp này là sin(x)) trong mảng s. Sau đó, nó rất thuận tiện để sử dụng chức năng numpy.nditer để có được cặp liên tiếp các mục trong ts, đại diện cho (x,y) phối hợp của một điểm dữ liệu, như trong:

for x, y in np.nditer([t,s]): 
    print("xy: %f:%f" % (x,y)) 

Vì vậy, tôi đang cố gắng đoạn sau như test.py:

import numpy as np 
print("numpy version {0}".format(np.__version__)) 
t = np.arange(0.0,1.5,0.25) ; print("t", ["%+.2e"%i for i in t]) 
s = np.sin(2*np.pi*t)   ; print("s", ["%+.2e"%i for i in s]) 
print("i", ["% 9d"%i for i in range(0, len(t))]) 
for x, y in np.nditer([t,s]): 
    print("xy: %f:%f" % (x,y)) 

... và kết quả là:

$ python3.2 test.py 
numpy version 1.7.0 
t ['+0.00e+00', '+2.50e-01', '+5.00e-01', '+7.50e-01', '+1.00e+00', '+1.25e+00'] 
s ['+0.00e+00', '+1.00e+00', '+1.22e-16', '-1.00e+00', '-2.45e-16', '+1.00e+00'] 
i ['  0', '  1', '  2', '  3', '  4', '  5'] 
xy: 0.000000:0.000000 
xy: 0.250000:1.000000 
xy: 0.500000:0.000000 
xy: 0.750000:-1.000000 
xy: 1.000000:-0.000000 
xy: 1.250000:1.000000 

$ python2.7 test.py 
numpy version 1.5.1 
('t', ['+0.00e+00', '+2.50e-01', '+5.00e-01', '+7.50e-01', '+1.00e+00', '+1.25e+00']) 
('s', ['+0.00e+00', '+1.00e+00', '+1.22e-16', '-1.00e+00', '-2.45e-16', '+1.00e+00']) 
('i', ['  0', '  1', '  2', '  3', '  4', '  5']) 
Traceback (most recent call last): 
    File "test.py", line 10, in <module> 
    for x, y in np.nditer([t,s]): 
AttributeError: 'module' object has no attribute 'nditer' 

Ah - hóa ra là the iterator object nditer, introduced in NumPy 1.6, không có trong phiên bản numpy của bản cài đặt Python 2.7 của tôi. Vì vậy, vì tôi cũng muốn hỗ trợ phiên bản cụ thể đó, tôi cần phải tìm cách làm việc cho số numpy cũ hơn - nhưng tôi vẫn muốn sự tiện lợi của việc chỉ định for x,y in somearray và nhận tọa độ trực tiếp trong vòng lặp.

Sau khi một số rối tung lên với numpy tài liệu hướng dẫn, tôi đã đưa ra getXyIter chức năng này:

import numpy as np 
print("numpy version {0}".format(np.__version__)) 
t = np.arange(0.0,1.5,0.25) ; print("t", ["%+.2e"%i for i in t]) 
s = np.sin(2*np.pi*t)   ; print("s", ["%+.2e"%i for i in s]) 
print("i", ["% 9d"%i for i in range(0, len(t))]) 

def getXyIter(inarr): 
    if np.__version__ >= "1.6.0": 
    return np.nditer(inarr.tolist()) 
    else: 
    dimensions = inarr.shape 
    xlen = dimensions[1] 
    xinds = np.arange(0, xlen, 1) 
    return np.transpose(np.take(inarr, xinds, axis=1)) 

for x, y in getXyIter(np.array([t,s])): 
    print("xyIt: %f:%f" % (x,y)) 

for x, y in np.nditer([t,s]): 
    print("xynd: %f:%f" % (x,y)) 

... mà dường như làm việc tốt

$ python2.7 test.py 
numpy version 1.5.1 
('t', ['+0.00e+00', '+2.50e-01', '+5.00e-01', '+7.50e-01', '+1.00e+00', '+1.25e+00']) 
('s', ['+0.00e+00', '+1.00e+00', '+1.22e-16', '-1.00e+00', '-2.45e-16', '+1.00e+00']) 
('i', ['  0', '  1', '  2', '  3', '  4', '  5']) 
xyIt: 0.000000:0.000000 
xyIt: 0.250000:1.000000 
xyIt: 0.500000:0.000000 
xyIt: 0.750000:-1.000000 
xyIt: 1.000000:-0.000000 
xyIt: 1.250000:1.000000 
Traceback (most recent call last): 
    File "test.py", line 23, in <module> 
    for x, y in np.nditer([t,s]): 
AttributeError: 'module' object has no attribute 'nditer' 
$ python3.2 test.py 
numpy version 1.7.0 
t ['+0.00e+00', '+2.50e-01', '+5.00e-01', '+7.50e-01', '+1.00e+00', '+1.25e+00'] 
s ['+0.00e+00', '+1.00e+00', '+1.22e-16', '-1.00e+00', '-2.45e-16', '+1.00e+00'] 
i ['  0', '  1', '  2', '  3', '  4', '  5'] 
xyIt: 0.000000:0.000000 
xyIt: 0.250000:1.000000 
xyIt: 0.500000:0.000000 
xyIt: 0.750000:-1.000000 
xyIt: 1.000000:-0.000000 
xyIt: 1.250000:1.000000 
xynd: 0.000000:0.000000 
xynd: 0.250000:1.000000 
xynd: 0.500000:0.000000 
xynd: 0.750000:-1.000000 
xynd: 1.000000:-0.000000 
xynd: 1.250000:1.000000 

Câu hỏi của tôi là - đây là cách , loại lặp này có nghĩa vụ phải được thực hiện, trong các phiên bản của < 1.6.0?

Trả lời

3

Làm thế nào về concatenating hai vectơ vào một mảng:

for x,y in np.c_[t,s]: 
    print("xy: %f:%f" % (x,y)) 

Điều này cho phép

xy: 0.000000:0.000000 
xy: 0.250000:1.000000 
xy: 0.500000:0.000000 
xy: 0.750000:-1.000000 
xy: 1.000000:-0.000000 
xy: 1.250000:1.000000 

Nếu bạn muốn lặp, do đó bạn có thể tiết kiệm bộ nhớ, bạn có thể sử dụng itertools.izip chức năng:

for x,y in itertools.izip(t,s): 
    print("xy: %f:%f" % (x,y)) 
0

for x, y in zip(t,s):. Đối với mảng 1d, nó thực sự đơn giản.

Được xác minh để hoạt động ở cả Python 2 và Python 3. zip() trả về một danh sách trên Python2, như DiggyF gợi ý, itertools.izip() có thể phù hợp hơn cho các mảng lớn.

Đối với> mảng 1D, di chuyển lặp qua mảng thứ nguyên trở về (N-1) D. Nếu bạn phải đối phó với các mảng N-d, điều này có thể hoặc không thể là những gì bạn muốn.

Bất kể, nó không thể nghi ngờ được di chuyển và lặp lại trên các đối tượng mảng nhằm hỗ trợ loại ứng dụng này :)

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