@ câu trả lời của Sven là cách dễ dàng, nhưng nó khá hiệu quả cho mảng lớn. Nếu bạn đang xử lý một mảng tương đối nhỏ, bạn sẽ không nhận thấy sự khác biệt, nếu bạn muốn một hồ sơ từ một lượng lớn (ví dụ: 50 MB), bạn có thể thử một vài phương pháp khác. Tuy nhiên, bạn sẽ cần phải làm việc trong các tọa độ "pixel" cho những điều này, do đó, có thêm một lớp phức tạp.
Có hai cách hiệu quả về bộ nhớ hơn. 1) sử dụng scipy.ndimage.map_coordinates
nếu bạn cần nội suy khối hoặc tuyến tính. 2) nếu bạn chỉ muốn lấy mẫu lân cận gần nhất, thì chỉ cần sử dụng lập chỉ mục trực tiếp.
Như một ví dụ về người đầu tiên:
import numpy as np
import scipy.ndimage
import matplotlib.pyplot as plt
#-- Generate some data...
x, y = np.mgrid[-5:5:0.1, -5:5:0.1]
z = np.sqrt(x**2 + y**2) + np.sin(x**2 + y**2)
#-- Extract the line...
# Make a line with "num" points...
x0, y0 = 5, 4.5 # These are in _pixel_ coordinates!!
x1, y1 = 60, 75
num = 1000
x, y = np.linspace(x0, x1, num), np.linspace(y0, y1, num)
# Extract the values along the line, using cubic interpolation
zi = scipy.ndimage.map_coordinates(z, np.vstack((x,y)))
#-- Plot...
fig, axes = plt.subplots(nrows=2)
axes[0].imshow(z)
axes[0].plot([x0, x1], [y0, y1], 'ro-')
axes[0].axis('image')
axes[1].plot(zi)
plt.show()
Tương đương sử dụng gần nhất, hàng xóm suy sẽ giống như thế này:
import numpy as np
import matplotlib.pyplot as plt
#-- Generate some data...
x, y = np.mgrid[-5:5:0.1, -5:5:0.1]
z = np.sqrt(x**2 + y**2) + np.sin(x**2 + y**2)
#-- Extract the line...
# Make a line with "num" points...
x0, y0 = 5, 4.5 # These are in _pixel_ coordinates!!
x1, y1 = 60, 75
num = 1000
x, y = np.linspace(x0, x1, num), np.linspace(y0, y1, num)
# Extract the values along the line
zi = z[x.astype(np.int), y.astype(np.int)]
#-- Plot...
fig, axes = plt.subplots(nrows=2)
axes[0].imshow(z)
axes[0].plot([x0, x1], [y0, y1], 'ro-')
axes[0].axis('image')
axes[1].plot(zi)
plt.show()
Tuy nhiên, nếu bạn đang sử dụng gần nhất-hàng xóm, bạn có lẽ sẽ chỉ muốn mẫu tại mỗi điểm ảnh, vì vậy bạn có thể muốn làm điều gì đó nhiều như thế này, thay vì ...
import numpy as np
import matplotlib.pyplot as plt
#-- Generate some data...
x, y = np.mgrid[-5:5:0.1, -5:5:0.1]
z = np.sqrt(x**2 + y**2) + np.sin(x**2 + y**2)
#-- Extract the line...
# Make a line with "num" points...
x0, y0 = 5, 4.5 # These are in _pixel_ coordinates!!
x1, y1 = 60, 75
length = int(np.hypot(x1-x0, y1-y0))
x, y = np.linspace(x0, x1, length), np.linspace(y0, y1, length)
# Extract the values along the line
zi = z[x.astype(np.int), y.astype(np.int)]
#-- Plot...
fig, axes = plt.subplots(nrows=2)
axes[0].imshow(z)
axes[0].plot([x0, x1], [y0, y1], 'ro-')
axes[0].axis('image')
axes[1].plot(zi)
plt.show()
Những dòng mặc dù? Không có đảm bảo là một "dòng" duy nhất giữa hai mục tùy ý trong một mảng. Thời gian duy nhất như vậy một dòng duy nhất sẽ tồn tại sẽ là nếu hai mục kết thúc nằm trong cùng một hàng, cùng một cột, cùng một đường chéo hoặc chống chéo. – talonmies
Đó là sự thật, bởi vì 'dòng' sẽ phải cắt ngang các điểm ảnh theo một cách không thống nhất, và có thể tạo ra các dòng khác nhau trong các phép tính khác nhau. Tuy nhiên, tôi chủ yếu quan tâm đến xu hướng của các giá trị trên hình ảnh dọc theo 'hướng' này từ điểm bắt đầu (r1, c1) đến (r2, c2). Các đặc điểm của việc lựa chọn dòng không thực sự quan trọng với nhu cầu của tôi. – achennu