Home > Enterprise >  Insert images from a collection to a matplotlib image matrix
Insert images from a collection to a matplotlib image matrix

Time:04-19

I have a school assignment and I got stuck iterating over things.
I want to iterate on the mathplotlib images matrix and insert images from a generator I created.

# this is the generator, it yields back 2 integers (true_value and prediction)
# and a {64,} image shape (image)

def false_negative_generator(X_test, y_test, predicted):
    for image, true_value, prediction in zip(X_test, y_test, predicted):
        if true_value != prediction:
            yield image, true_value, prediction

the code I iterate with is obviously not good, but I can't figure out how to implement my desired iteration.

# axrow is a row in the plot matrix, ax is a cell in the matrix
for image, lable, prediction in false_negative_generator(X_test, y_test, predicted):
    for axrow in axes:
        for ax in axrow:
            ax.set_axis_off()
            ax.imshow(image.reshape(8, 8), cmap=plt.cm.gray_r, interpolation="nearest")
            ax.set_title(f"{lable} {prediction}")

I hope the question is clear and understandable. I'd love to know if something is not 100% with the question for future improvements.
Thanks!

EDIT:

My goal is to insert every object from the generator to a single matrix cell.\

[What I get now is this (the last object from the generator in all matrix cell, when I want a different object in every cell):1

CodePudding user response:

Assuming that the number of images returned by your generator is the same as the number of axis of your figure, you can do something like this:

i = 0 # counter
axs = axes.flatten() # convert the grid of axes to an array
for image, lable, prediction in false_negative_generator(X_test, y_test, predicted):
    axs[i].set_axis_off()
    axs[i].imshow(image.reshape(8, 8), cmap=plt.cm.gray_r, interpolation="nearest")
    axs[i].set_title(f"{lable} {prediction}")
    i  = 1

CodePudding user response:

You can probably use something along the following lines:

iterator = false_negative_generator(X_test, y_test, predicted)
for axrow in axes:
    for ax in axrow:
       image, lable, prediction = next(iterator)
       ax.set_axis_off()
       ax.imshow(image.reshape(8, 8), cmap=plt.cm.gray_r, interpolation="nearest")
       ax.set_title(f"{lable} {prediction}")

That creates the iterator, but doesn't yet retrieve the data. The next() function then advances the iterator each time inside the nested loop, retrieving the necessary items from the iterator.

  • Related