table.__init__ now has common order of arguments (label, data)
This commit is contained in:
parent
c5c2763e1f
commit
0d22cfb83d
2
PRIVATE
2
PRIVATE
|
@ -1 +1 @@
|
|||
Subproject commit 9c1f83babb7894bfaa16255d6c15a4a438c7f168
|
||||
Subproject commit 317345ab8fffbb120630846a47ab25922d466e14
|
|
@ -373,7 +373,7 @@ class Colormap(mpl.colors.ListedColormap):
|
|||
|
||||
"""
|
||||
labels = {'RGBA':4} if self.colors.shape[1] == 4 else {'RGB': 3}
|
||||
t = Table(self.colors,labels,f'Creator: {util.execution_stamp("Colormap")}')
|
||||
t = Table(labels,self.colors,f'Creator: {util.execution_stamp("Colormap")}')
|
||||
t.save(self._get_file_handle(fname,'.txt'))
|
||||
|
||||
|
||||
|
|
|
@ -13,26 +13,27 @@ class Table:
|
|||
"""Manipulate multi-dimensional spreadsheet-like data."""
|
||||
|
||||
def __init__(self,
|
||||
data: np.ndarray,
|
||||
shapes: dict,
|
||||
data: np.ndarray,
|
||||
comments: Union[str, list] = None):
|
||||
"""
|
||||
New spreadsheet.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
data : numpy.ndarray or pandas.DataFrame
|
||||
Data. Column labels from a pandas.DataFrame will be replaced.
|
||||
shapes : dict with str:tuple pairs
|
||||
Shapes of the columns. Example 'F':(3,3) for a deformation gradient.
|
||||
Shapes of the data columns.
|
||||
For instance, 'F':(3,3) for a deformation gradient, or 'r':(1,) for a scalar.
|
||||
data : numpy.ndarray or pandas.DataFrame
|
||||
Data. Existing column labels of a pandas.DataFrame will be replaced.
|
||||
comments : str or iterable of str, optional
|
||||
Additional, human-readable information.
|
||||
|
||||
"""
|
||||
comments_ = [comments] if isinstance(comments,str) else comments
|
||||
self.comments = [] if comments_ is None else [c for c in comments_]
|
||||
self.data = pd.DataFrame(data=data)
|
||||
self.shapes = { k:(v,) if isinstance(v,(np.int64,np.int32,int)) else v for k,v in shapes.items() }
|
||||
self.data = pd.DataFrame(data=data)
|
||||
self._relabel('uniform')
|
||||
|
||||
|
||||
|
@ -70,8 +71,8 @@ class Table:
|
|||
--------
|
||||
>>> import damask
|
||||
>>> import numpy as np
|
||||
>>> tbl = damask.Table(data=np.arange(12).reshape((4,3)),
|
||||
... shapes=dict(colA=(1,),colB=(1,),colC=(1,)))
|
||||
>>> tbl = damask.Table(shapes=dict(colA=(1,),colB=(1,),colC=(1,)),
|
||||
... data=np.arange(12).reshape((4,3)))
|
||||
>>> tbl['colA','colB']
|
||||
colA colB
|
||||
0 0 1
|
||||
|
@ -282,7 +283,7 @@ class Table:
|
|||
|
||||
data = pd.read_csv(f,names=list(range(len(labels))),sep=r'\s+')
|
||||
|
||||
return Table(data,shapes,comments)
|
||||
return Table(shapes,data,comments)
|
||||
|
||||
|
||||
@staticmethod
|
||||
|
@ -329,7 +330,7 @@ class Table:
|
|||
if (remainder := data.shape[1]-sum(shapes.values())) > 0:
|
||||
shapes['unknown'] = remainder
|
||||
|
||||
return Table(data,shapes,comments)
|
||||
return Table(shapes,data,comments)
|
||||
|
||||
|
||||
@property
|
||||
|
|
|
@ -90,7 +90,7 @@ class TestConfigMaterial:
|
|||
np.ones(N*2),np.zeros(N*2),np.ones(N*2),np.ones(N*2),
|
||||
np.ones(N*2),
|
||||
)).T
|
||||
t = Table(a,{'varying':1,'constant':4,'ones':1})
|
||||
t = Table({'varying':1,'constant':4,'ones':1},a)
|
||||
c = ConfigMaterial.from_table(t,**{'phase':'varying','O':'constant','homogenization':'ones'})
|
||||
assert len(c['material']) == N
|
||||
for i,m in enumerate(c['material']):
|
||||
|
@ -102,7 +102,7 @@ class TestConfigMaterial:
|
|||
np.ones(N*2),np.zeros(N*2),np.ones(N*2),np.ones(N*2),
|
||||
np.ones(N*2),
|
||||
)).T
|
||||
t = Table(a,{'varying':1,'constant':4,'ones':1})
|
||||
t = Table({'varying':1,'constant':4,'ones':1},a)
|
||||
c = ConfigMaterial.from_table(t,**{'phase':'varying','O':'constant','homogenization':1})
|
||||
assert len(c['material']) == N
|
||||
for i,m in enumerate(c['material']):
|
||||
|
|
|
@ -437,7 +437,7 @@ class TestGrid:
|
|||
coords = grid_filters.coordinates0_point(cells,size).reshape(-1,3,order='F')
|
||||
z = np.ones(cells.prod())
|
||||
z[cells[:2].prod()*int(cells[2]/2):] = 0
|
||||
t = Table(np.column_stack((coords,z)),{'coords':3,'z':1})
|
||||
t = Table({'coords':3,'z':1},np.column_stack((coords,z)))
|
||||
t = t.add('indicator',t.get('coords')[:,0])
|
||||
g = Grid.from_table(t,'coords',['indicator','z'])
|
||||
assert g.N_materials == g.cells[0]*2 and (g.material[:,:,-1]-g.material[:,:,0] == cells[0]).all()
|
||||
|
@ -449,7 +449,7 @@ class TestGrid:
|
|||
s = seeds.from_random(size,np.random.randint(60,100))
|
||||
grid = Grid.from_Voronoi_tessellation(cells,size,s)
|
||||
coords = grid_filters.coordinates0_point(cells,size)
|
||||
t = Table(np.column_stack((coords.reshape(-1,3,order='F'),grid.material.flatten(order='F'))),{'c':3,'m':1})
|
||||
t = Table({'c':3,'m':1},np.column_stack((coords.reshape(-1,3,order='F'),grid.material.flatten(order='F'))))
|
||||
assert grid.sort().renumber() == Grid.from_table(t,'c',['m'])
|
||||
|
||||
|
||||
|
|
|
@ -8,7 +8,9 @@ from damask import Table
|
|||
def default():
|
||||
"""Simple Table."""
|
||||
x = np.ones((5,13),dtype=float)
|
||||
return Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['test data','contains five rows of only ones'])
|
||||
return Table({'F':(3,3),'v':(3,),'s':(1,)},
|
||||
x,
|
||||
['test data','contains five rows of only ones'])
|
||||
|
||||
@pytest.fixture
|
||||
def ref_path(ref_path_base):
|
||||
|
@ -22,7 +24,7 @@ class TestTable:
|
|||
|
||||
@pytest.mark.parametrize('N',[10,40])
|
||||
def test_len(self,N):
|
||||
assert len(Table(np.random.rand(N,3),{'X':3})) == N
|
||||
assert len(Table({'X':3},np.random.rand(N,3))) == N
|
||||
|
||||
def test_get_scalar(self,default):
|
||||
d = default.get('s')
|
||||
|
@ -110,7 +112,7 @@ class TestTable:
|
|||
|
||||
def test_rename_equivalent(self):
|
||||
x = np.random.random((5,13))
|
||||
t = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data'])
|
||||
t = Table({'F':(3,3),'v':(3,),'s':(1,)},x,['random test data'])
|
||||
s = t.get('s')
|
||||
u = t.rename('s','u').get('u')
|
||||
assert np.all(s == u)
|
||||
|
@ -129,35 +131,35 @@ class TestTable:
|
|||
|
||||
def test_join(self):
|
||||
x = np.random.random((5,13))
|
||||
a = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data'])
|
||||
a = Table({'F':(3,3),'v':(3,),'s':(1,)},x,['random test data'])
|
||||
y = np.random.random((5,3))
|
||||
b = Table(y,{'u':(3,)},['random test data'])
|
||||
b = Table({'u':(3,)},y,['random test data'])
|
||||
c = a.join(b)
|
||||
assert np.array_equal(c.get('u'), b.get('u'))
|
||||
|
||||
def test_join_invalid(self):
|
||||
x = np.random.random((5,13))
|
||||
a = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data'])
|
||||
a = Table({'F':(3,3),'v':(3,),'s':(1,)},x,['random test data'])
|
||||
with pytest.raises(KeyError):
|
||||
a.join(a)
|
||||
|
||||
def test_append(self):
|
||||
x = np.random.random((5,13))
|
||||
a = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data'])
|
||||
a = Table({'F':(3,3),'v':(3,),'s':(1,)},x,['random test data'])
|
||||
b = a.append(a)
|
||||
assert np.array_equal(b.data[:5].to_numpy(),b.data[5:].to_numpy())
|
||||
|
||||
def test_append_invalid(self):
|
||||
x = np.random.random((5,13))
|
||||
a = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data'])
|
||||
b = Table(x,{'F':(3,3),'u':(3,),'s':(1,)},['random test data'])
|
||||
a = Table({'F':(3,3),'v':(3,),'s':(1,)},x,['random test data'])
|
||||
b = Table({'F':(3,3),'u':(3,),'s':(1,)},x,['random test data'])
|
||||
with pytest.raises(KeyError):
|
||||
a.append(b)
|
||||
|
||||
def test_invalid_initialization(self):
|
||||
x = np.random.random((5,10))
|
||||
with pytest.raises(ValueError):
|
||||
Table(x,{'F':(3,3)})
|
||||
Table({'F':(3,3)},x)
|
||||
|
||||
def test_invalid_set(self,default):
|
||||
x = default.get('v')
|
||||
|
@ -170,27 +172,27 @@ class TestTable:
|
|||
|
||||
def test_sort_scalar(self):
|
||||
x = np.random.random((5,13))
|
||||
t = Table(x,{'F':(3,3),'v':(3,),'s':(1,)},['random test data'])
|
||||
t = Table({'F':(3,3),'v':(3,),'s':(1,)},x,['random test data'])
|
||||
unsort = t.get('s')
|
||||
sort = t.sort_by('s').get('s')
|
||||
assert np.all(np.sort(unsort,0)==sort)
|
||||
|
||||
def test_sort_component(self):
|
||||
x = np.random.random((5,12))
|
||||
t = Table(x,{'F':(3,3),'v':(3,)},['random test data'])
|
||||
t = Table({'F':(3,3),'v':(3,)},x,['random test data'])
|
||||
unsort = t.get('F')[:,1,0]
|
||||
sort = t.sort_by('F[1,0]').get('F')[:,1,0]
|
||||
assert np.all(np.sort(unsort,0)==sort)
|
||||
|
||||
def test_sort_revert(self):
|
||||
x = np.random.random((5,12))
|
||||
t = Table(x,{'F':(3,3),'v':(3,)},['random test data'])
|
||||
t = Table({'F':(3,3),'v':(3,)},x,['random test data'])
|
||||
sort = t.sort_by('F[1,0]',ascending=False).get('F')[:,1,0]
|
||||
assert np.all(np.sort(sort,0)==sort[::-1])
|
||||
|
||||
def test_sort(self):
|
||||
t = Table(np.array([[0,1,],[2,1,]]),
|
||||
{'v':(2,)},
|
||||
t = Table({'v':(2,)},
|
||||
np.array([[0,1,],[2,1,]]),
|
||||
['test data'])\
|
||||
.add('s',np.array(['b','a']))\
|
||||
.sort_by('s')
|
||||
|
|
|
@ -179,7 +179,7 @@ class TestVTK:
|
|||
for k,s in shapes.items():
|
||||
d[k] = dict(shape = s,
|
||||
data = np.random.random(N*np.prod(s)).reshape((N,-1)))
|
||||
new = default.add(Table(np.column_stack([d[k]['data'] for k in shapes.keys()]),shapes))
|
||||
new = default.add(Table(shapes,np.column_stack([d[k]['data'] for k in shapes.keys()])))
|
||||
for k,s in shapes.items():
|
||||
assert np.allclose(np.squeeze(d[k]['data']),new.get(k),rtol=1e-7)
|
||||
|
||||
|
|
Loading…
Reference in New Issue