Search code examples
pythonarraysnumpymatplotlibscatter-plot

How to make scatterplot with nested array of arrays


I am trying to make a scatter plot with the list of coordinates I have. I'm just confused how to separate these coordinates into x and y so that I can plug it into the plt.scatter() function, especially considering it is a nested array of arrays.

   array([array([1., 0.]), array([ 0., -1.]), array([-1.,  0.]),
   array([-1., -1.]), array([ 1., -1.]), array([ 0., -2.]),
   array([-2.,  0.]), array([2., 0.]), array([-2., -1.]),
   array([ 2., -1.]), array([-1., -2.]), array([ 1., -2.]),
   array([-2., -2.]), array([ 2., -2.]), array([ 0., -3.]),
   array([3., 0.]), array([-3.,  0.]), array([ 1., -3.]),
   array([-1., -3.]), array([ 3., -1.]), array([-3., -1.]),
   array([-2., -3.]), array([ 3., -2.]), array([-3., -2.]),
   array([ 2., -3.]), array([-4.,  0.]), array([4., 0.]),
   array([-4., -1.]), array([ 4., -1.]), array([-3., -3.]),
   array([ 3., -3.]), array([ 4., -2.]), array([-4., -2.]),
   array([ 4., -3.]), array([-4., -3.]), array([-1., -5.]),
   array([ 1., -5.]), array([-5., -1.]), array([-5., -2.]),
   array([-5., -3.]), array([ 3., -5.]), array([-3., -5.]),
   array([-6.,  0.]), array([-6., -1.]), array([-6., -2.]),
   array([-6., -3.]), array([-5., -5.]), array([-7., -1.]),
   array([ 1., -7.]), array([-1., -7.]), array([-7., -2.]),
   array([-3., -7.]), array([-7., -3.]), array([ 3., -7.]),
   array([-7., -5.]), array([-5., -7.]), array([-1., -9.]),
   array([ 1., -9.]), array([ 3., -9.]), array([-3., -9.]),
   array([-7., -7.]), array([-5., -9.]), array([  1., -11.]),
   array([ -1., -11.]), array([ -3., -11.]), array([  3., -11.]),
   array([-7., -9.]), array([ -5., -11.]), array([ -7., -11.])],
  dtype=object)

Solution

  • import numpy as np
    import matplotlib.pyplot as plt
    
    arr = np.array([
        0,
        np.array([0.,  3.]),
        np.array([2., 4.]),
        np.array([-3., -1.]),
        np.array([-4.,  2.]),
        np.array([2., 0.]),
        np.array([-2., -2.])
    ], dtype=object)[1:]
    print(repr(arr))
    

    prints:

    array([array([0., 3.]), array([2., 4.]), array([-3., -1.]),
           array([-4.,  2.]), array([2., 0.]), array([-2., -2.])],
          dtype=object)
    

    then you can use np.stack (as others have already suggested in the comments) to convert arr to a 2d-array:

    arr = np.stack(arr)
    print(repr(arr))
    

    which prints:

    array([[ 0.,  3.],
           [ 2.,  4.],
           [-3., -1.],
           [-4.,  2.],
           [ 2.,  0.],
           [-2., -2.]])
    

    and is much easier to plot:

    plt.scatter(arr[:, 0], arr[:, 1])