In [ ]:
class Particle(object):
    def __init__(self, x=0, y=0, z=0):
        self.x = x
        self.y = y
        self.z = z
    def __repr__(self):
        return "x={}\ny={}\nz={}".format(self.x, self.y, self.z)
    def apply_lateral_wind(self, dx, dy):
        self.x += dx
        self.y += dy

start_values = np.random.random((int(1e6),3))

particles = [Particle(*i) for i in start_values]

In [ ]:
%timeit np.linalg.norm(start_values, axis=1)

In [ ]:
%timeit _ = [p.apply_lateral_wind(0.5, 1.2) for p in particles]

In [ ]:
%timeit start_values[...,:2] += np.array([0.5,1.2])

In [ ]:
class NumpyParticle(object):
    def __init__(self, coords):
        self.coords = coords
    @property
    def x(self):
        return self.coords[0]
    @property
    def y(self):
        return self.coords[1]
    @property
    def z(self):
        return self.coords[2]

    def __repr__(self):
        return "x={}\ny={}\nz={}".format(self.x, self.y, self.z)
    def apply_lateral_wind(self, dx, dy):
        self.coords[0] += dx
        self.coords[1] += dy

start_values = np.random.random((int(1e6), 3))
numpyparticles = [NumpyParticle(i) for i in start_values]

In [ ]:
%timeit _ = [p.apply_lateral_wind(0.5, 1.2) for p in numpyparticles]

In [ ]:
class Particles(object):
    def __init__(self, coords):
        self.coords = coords

    def __repr__(self):
        return "Particles(coords={})".format(self.coords)

    def apply_lateral_wind(self, dx, dy):
        self.coords[:, 0] += dx
        self.coords[:, 1] += dy

    def apply_lateral_wind2(self, dx, dy):
        self.coords[..., :2] += [dx, dy]

start_values = np.random.random((int(1e6), 3))        
particles = Particles(start_values)

In [ ]:
%timeit particles.apply_lateral_wind(0.5, 1.2)

In [ ]:
%timeit particles.apply_lateral_wind2(0.5, 1.2)

In [ ]:
import numpy as np
from numba import jitclass          # import the decorator
from numba import int32, float32, float64    # import the types

spec = [
    ('x', float32),               # a simple scalar field
    ('y', float32),               # a simple scalar field
    ('z', float32),               # a simple scalar field
]

@jitclass(spec)
class NumbaParticle(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def apply_lateral_wind(self, dx, dy):
        self.x += dx
        self.y += dy

In [ ]:
particles = [NumbaParticle(*i) for i in start_values]

In [ ]:
start_values = np.random.random((int(1e6), 3))

In [ ]:
spec = [
    ('coords', float64[:,:]),
]

@jitclass(spec)
class NumbaParticles(object):
    def __init__(self, coords):
        self.coords = coords

    def apply_lateral_wind(self, dx, dy):
        self.coords[:, 0] += dx
        self.coords[:, 1] += dy

    def apply_lateral_wind2(self, dx, dy):
        self.coords[:, :2] += np.array([dx, dy], dtype=float64)

In [ ]:
particles = NumbaParticles(start_values)

In [ ]:
%timeit particles.apply_lateral_wind(0.5, 1.2)

In [ ]:
%timeit particles.apply_lateral_wind2(0.5, 1.2)

In [ ]:
from planet4 import io

In [ ]:
db = io.DBManager()

In [ ]:
data = db.get_image_name_markings("PSP_003092_0985")

In [ ]:
blotches = data[data.marking=='blotch']

In [ ]:
blotches[(blotches.radius_1<10) | (blotches.radius_2<10)]

In [ ]:
%matplotlib inline

In [ ]:
blotches[blotches.radius_2 <20].radius_1.hist(bins=100)

In [ ]:
fans = data[data.marking=='fan']

In [ ]:
fans.columns

In [ ]:
plt.figure()
fans[fans.distance<50].distance.value_counts()

In [ ]:
fans.angle.hist(bins=100)

In [ ]:
fans.columns

In [ ]:
fans[fans.spread<50].spread.hist(bins=100)

In [ ]:
fans[fans.spread<50].spread.value_counts().head()

In [ ]:
fans[fans.spread<10].distance.hist(bins=50)

In [ ]: