我在一个项目中工作,我必须创建一个方法来生成具有背景和矢量流的图像。所以,我正在使用 matplotlib 的流图。
class ImageData(object):
def __init__(self, width=400, height=400, range_min=-1, range_max=1):
"""
The ImageData constructor
"""
self.width = width
self.height = height
#The values range each pixel can assume
self.range_min = range_min
self.range_max = range_max
#self.data = np.arange(width*height).reshape(height, width)
self.data = []
for i in range(width):
self.data.append([0] * height)
def generate_images_with_streamline(self, file_path, background):
# Getting the vector flow
x_vectors = []
y_vectors = []
for i in range(self.width):
x_vectors.append([0.0] * self.height)
y_vectors.append([0.0] * self.height)
for x in range(1, self.width-1):
for y in range(1, self.height-1):
vector = self.data[x][y]
x_vectors[x][y] = vector[0].item(0)
y_vectors[x][y] = vector[1].item(0)
u_coord = np.array(x_vectors)
v_coord = np.array(y_vectors)
# Static image size
y, x = np.mgrid[-1:1:400j, -1:1:400j]
# Background + vector flow
mg = mpimg.imread(background)
plt.figure()
plt.imshow(mg, extent=[-1, 1, -1, 1])
plt.streamplot(x, y, u_coord, v_coord, color='y', density=2, cmap=plt.cm.autumn)
plt.savefig(file_path+'Streamplot.png')
plt.close()
问题是'因为我的 np.mgrid 应该从-1到1不等,并且 self.width 和 self.height 。但如果这样做:
y, x = np.mgrid[-1:1:self.width, -1:1:self.height]
它不起作用。并且也不知道这个 j 意味着什么,但这似乎很重要,因为如果我取消 j (即使是静态大小),它也不起作用。所以,我想知道如何按照自我大小动态执行 mgrid 。
提前谢谢。
答案 0 :(得分:2)
简短回答
j
是复数的虚部,并且numpy.mgrid
为number of values to generate。在你的情况下,这是你要写的:
y, x = np.mgrid[-1:1:self.width*1j, -1:1:self.height*1j]
答案很长
step
中的 np.mgrid[start:stop:step]
值应理解如下:
step
是真的,那么它将被用作从开始到停止的步进,不包括在内。step
是纯虚构的(例如5j
),则会将其用作返回的步骤数,包括stop
值。step
很复杂,(例如1+5j
),我必须说我不理解结果...... j
是虚构的部分。
示例:
>>> np.mgrid[-1:1:0.5] # values starting at -1, using 0.5 as step, up to 1 (not included)
array([-1. , -0.5, 0. , 0.5])
>>> np.mgrid[-1:1:4j] # values starting at -1 up to +1, 4 values requested
array([-1. , -0.33333333, 0.33333333, 1. ])
>>> np.mgrid[-1:1:1+4j] # ???
array([-1. , -0.3596118 , 0.28077641, 0.92116461])