Search code examples
pythonnumpymatplotlibmatplotlib-animation

ValueError: assignment destination is read-only


My goal is to make aliasing in python but actually i have problem ValueError: assignment destination is read-only. This because of this line

numpy_new[:lines * k][:][:] = numpy_last

And I don't know how solve this.

import warnings
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation, FuncAnimation
from PIL import Image
warnings.filterwarnings("ignore", category=DeprecationWarning)
N = 3
M = 64
PI = np.pi
x = np.linspace(1, 10, 1000)
y_ = np.sin((N * x + (1 * PI) / 10))
subplot_kw = {'projection': 'polar'}
fig, ax = plt.subplots()
lines = 16
sensor_img = []
for i in range(M):
    k = i
    if i == 0:
        image = Image.open(f'proppler/myplot{i}.png')
        sensor_img.append(image)
        image.save(fr'Sensor/sensor{i}.png')
        continue
    last = sensor_img[k - 1]
    numpy_last = np.asarray(last)[:lines * k][:][:]
    new_image = Image.open(fr'proppler/myplot{i}.png')
    numpy_new = np.asarray(new_image)

    numpy_new[:lines * k][:][:] = numpy_last
    result = Image.fromarray(numpy_new)
    result.save(fr'Sensor/sensor{i}.png')
    if k == 16:
        k = 0
    sensor_img.append(result)

ims = []
for i in range(M):
    im_file = plt.imread(f'Sensor/sensor{i}.png')
    im = ax.imshow(im_file)
    ims.append([im])
    if i == 64:
        break

plt.grid(False)
plt.axis('off')

ani = ArtistAnimation(fig, ims, interval=100, blit=True, repeat_delay=0)
plt.show()

Thank you everyone for help.


Solution

  • You can try changing numpy_last = np.asarray to numpy_last = np.array as suggested here.

    If you included images I could test it but now it's just a guess

    As for testing I did the syntax seems correct and I could force read_only error

    import numpy as np
    
    b = np.zeros((2, 2)) + 1
    a = np.zeros((3, 3))
    c = np.asarray(a)
    
    print(a, b, c, sep="\n")
    
    c[:2, :2] = b
    a[:2, :2] = b
    
    print("----")
    print(a, b, c, sep="\n")
    
    print("Forced error \n")
    c.setflags(write=0)
    c[:2, :2] = b
    

    Output:

    [[0. 0. 0.]
     [0. 0. 0.]
     [0. 0. 0.]]
    [[1. 1.]
     [1. 1.]]
    [[0. 0. 0.]
     [0. 0. 0.]
     [0. 0. 0.]]
    ----
    [[1. 1. 0.]
     [1. 1. 0.]
     [0. 0. 0.]]
    [[1. 1.]
     [1. 1.]]
    [[1. 1. 0.]
     [1. 1. 0.]
     [0. 0. 0.]]
    Force an error 
    
    Traceback (most recent call last):
      File "/tmp/n = int(input("Enter an integer: "))", line 17, in <module>
        c[:2, :2] = b
    ValueError: assignment destination is read-only