Object 'numpy.ndarray' has no attribute 'imshow'

I've tried everything I can to get pyplot to display the image 5 times. I keep getting this error ...

Here is my code

import matplotlib.pyplot as plt
import os.path
import numpy as np

'''Read the image data'''
# Get the directory of this python script
directory = os.path.dirname(os.path.abspath(__file__))
# Build an absolute filename from directory + filename
filename = os.path.join(directory, 'cat.gif')
# Read the image data into an array
img = plt.imread(filename)

'''Show the image data'''
# Create figure with 1 subplot
fig, ax = plt.subplots(1, 5)
# Show the image data in a subplot

for i in ax:
    ax.imshow(img, interpolation='none')
# Show the figure on the screen
fig.show()

      

I'm sure it has something to do with 2D array, but I really can't figure it out.

Ive tried

for i in ax:
    ax[i].imshow(img, interpolation='none')
# Show the figure on the screen
fig.show()

      

But I just get:

IndexError: only integers, slices ( :

), ellipsis ( ...

), numpy.newaxis ( None

), and integer or boolean arrays are valid indices

+4


source to share


2 answers


It:

for i in ax:
    ax[i].imshow(img, interpolation='none')

      

doesn't make sense because i am not an index. This is one of the axis objects.



And your first case is wrong, because even though you are iterating over the elements, you are calling the function on ax

, not the individual axes.

Do it:

for a in ax:
    a.imshow(img, interpolation='none')

      

+5


source


you can test the ax as below

type(ax)
>>> <class 'numpy.ndarray'>

ax
>>> [<matplotlib.axes._subplots.AxesSubplot object at 0x0000028F13AFC668>
 <matplotlib.axes._subplots.AxesSubplot object at 0x0000028F15C6FCF8>
 <matplotlib.axes._subplots.AxesSubplot object at 0x0000028F15CA23C8>
 <matplotlib.axes._subplots.AxesSubplot object at 0x0000028F15CC9A58>
 <matplotlib.axes._subplots.AxesSubplot object at 0x0000028F15CFA160>]

      

if you really want to use 'i' use enumerate () like this

for i, ax in enumerate(axs):
    ax.imshow(img[i:i*100], interpolation='none')

      



"Axes" are preferable because they are multiple.

finally you can check below

import numpy as np
import matplotlib.pyplot as plt
from skimage import data

'''Read the image data'''
img = data.chelsea()   # cat image

'''Show the image data'''
# Create figure with 1 subplot
fig, axs = plt.subplots(nrows=1, ncols=5, figsize=(10, 3))

print(axs)
# [<matplotlib.axes._subplots.AxesSubplot object at 0x000001D7A841C710>
#  <matplotlib.axes._subplots.AxesSubplot object at 0x000001D7AA58FCC0>
#  <matplotlib.axes._subplots.AxesSubplot object at 0x000001D7AA5C2390>
#  <matplotlib.axes._subplots.AxesSubplot object at 0x000001D7AA5E9A20>
#  <matplotlib.axes._subplots.AxesSubplot object at 0x000001D7AA61A128>]

print(axs.shape)  # (1,5)

# Show the image data in a subplot
for i, ax in enumerate(axs):
    print(ax)     # AxesSubplot(0.125,0.11;0.133621x0.77)
    img_made_changeable = img[i:(i + 2) * 50]
    ax.imshow(img_made_changeable, interpolation='none')

# Show the figure on the screen
plt.show()

      

0


source







All Articles