Salome HOME
Merge remote-tracking branch 'origin/abn/bug_fixes' into V8_5_BR
[tools/medcoupling.git] / src / MEDCoupling_Swig / MEDCouplingNumPyTest.py
index 9631ee00e4b0e35c4f7ce0ca6ec9d060c291408f..90c6f5eb80a857bde13bf554f959ca0838f07b7d 100644 (file)
@@ -1,5 +1,5 @@
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2014  CEA/DEN, EDF R&D
+# Copyright (C) 2007-2016  CEA/DEN, EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -31,7 +31,7 @@ import os,gc,weakref,unittest
 
 class MEDCouplingNumPyTest(unittest.TestCase):
     
-    @unittest.skipUnless(MEDCouplingHasNumPyBindings() and architecture()[0]=="64bit","requires numpy")
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
     def test1(self):
         sz=20
         a=array(0,dtype=int32)
@@ -102,8 +102,7 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         d=DataArrayInt(a)
         self.assertEqual(weakref.getweakrefcount(a),1)
         self.assertTrue(not a.flags["OWNDATA"])
-        self.assertTrue(d.isIdentity())
-        self.assertEqual(len(d),20)
+        self.assertTrue(d.isIota(20))
         a[:]=2 # modifying a and d because a and d share the same chunk of data
         self.assertTrue(d.isUniform(2))
         del d # d is destroyed, a retrieves its ownership of its initial chunk of data
@@ -120,8 +119,8 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         a=arange(20,dtype=int32)
         d=DataArrayInt(a) # d owns data of a
         e=DataArrayInt(a) # a not owned -> e only an access to chunk of a 
-        self.assertTrue(d.isIdentity())
-        self.assertTrue(e.isIdentity())
+        self.assertTrue(d.isIota(d.getNumberOfTuples()))
+        self.assertTrue(e.isIota(e.getNumberOfTuples()))
         a[:]=6
         self.assertTrue(d.isUniform(6))
         self.assertTrue(e.isUniform(6))
@@ -155,13 +154,13 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         del b # no impact on e and f because a is the base of a.
         ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
         gc.collect()
-        self.assertTrue(f.isIdentity())
-        self.assertTrue(e.isIdentity())
+        self.assertTrue(f.isIota(f.getNumberOfTuples()))
+        self.assertTrue(e.isIota(e.getNumberOfTuples()))
         del a # a destroyed, but as c has its base set to a, a exists -> e and f not allocated
         ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
         gc.collect()
-        self.assertTrue(f.isIdentity())
-        self.assertTrue(e.isIdentity())
+        self.assertTrue(f.isIota(f.getNumberOfTuples()))
+        self.assertTrue(e.isIota(e.getNumberOfTuples()))
         del c # c killed -> a killed -> e and d are put into not allocated state
         ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
         gc.collect()        
@@ -387,7 +386,7 @@ class MEDCouplingNumPyTest(unittest.TestCase):
     def test19(self):
         sz=20
         a=array(0,dtype=int32)
-        a.resize(sz/2,2)
+        a.resize(sz//2,2)
         a[:]=4
         self.assertEqual(getrefcount(a),2)
         d=DataArrayInt(a)
@@ -406,7 +405,7 @@ class MEDCouplingNumPyTest(unittest.TestCase):
     def test20(self):
         sz=20
         a=array(0,dtype=float64)
-        a.resize(sz/2,2)
+        a.resize(sz//2,2)
         a[:]=4
         self.assertEqual(getrefcount(a),2)
         d=DataArrayDouble(a)
@@ -423,7 +422,7 @@ class MEDCouplingNumPyTest(unittest.TestCase):
 
     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
     def test21(self):
-        #tests that only DataArray*(npArray) contructor is available
+        #tests that only DataArray*(npArray) constructor is available
         a=array(0,dtype=int32)
         a.resize(20)
         DataArrayInt(a)
@@ -563,33 +562,33 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         b=DataArrayInt(a)
         c=DataArrayInt(a)
         d=DataArrayInt(a)
-        self.assertTrue(b.isIdentity()) ; self.assertEqual(len(b),10)
-        self.assertTrue(c.isIdentity()) ; self.assertEqual(len(c),10)
-        self.assertTrue(d.isIdentity()) ; self.assertEqual(len(d),10)
+        self.assertTrue(b.isIota(10))
+        self.assertTrue(c.isIota(10))
+        self.assertTrue(d.isIota(10))
         c.pushBackSilent(10) # c and a,b are dissociated
-        self.assertTrue(b.isIdentity()) ; self.assertEqual(len(b),10)
-        self.assertTrue(c.isIdentity()) ; self.assertEqual(len(c),11)
-        self.assertTrue(d.isIdentity()) ; self.assertEqual(len(d),10)
+        self.assertTrue(b.isIota(10))
+        self.assertTrue(c.isIota(11))
+        self.assertTrue(d.isIota(10))
         del a
         gc.collect()
-        self.assertTrue(b.isIdentity()) ; self.assertEqual(len(b),10)
-        self.assertTrue(c.isIdentity()) ; self.assertEqual(len(c),11)
+        self.assertTrue(b.isIota(10))
+        self.assertTrue(c.isIota(11))
         self.assertTrue(not d.isAllocated())
         del b
         gc.collect()
-        self.assertTrue(c.isIdentity()) ; self.assertEqual(len(c),11)
+        self.assertTrue(c.isIota(11))
         #
         a=arange(10,dtype=int32)
         b=DataArrayInt(a)
         c=DataArrayInt(a)
-        self.assertTrue(b.isIdentity()) ; self.assertEqual(len(b),10)
-        self.assertTrue(c.isIdentity()) ; self.assertEqual(len(c),10)
+        self.assertTrue(b.isIota(10))
+        self.assertTrue(c.isIota(10))
         b.pushBackSilent(10) # c and a,b are dissociated
-        self.assertTrue(b.isIdentity()) ; self.assertEqual(len(b),11)
-        self.assertTrue(c.isIdentity()) ; self.assertEqual(len(c),10)
+        self.assertTrue(b.isIota(11))
+        self.assertTrue(c.isIota(10))
         del a
         gc.collect()
-        self.assertTrue(b.isIdentity()) ; self.assertEqual(len(b),11)
+        self.assertTrue(b.isIota(11))
         self.assertTrue(not c.isAllocated())
         del b
         gc.collect()
@@ -656,6 +655,408 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         self.assertEqual(a2.tolist(),[[0.,1.,2.],[3.,4.,5.],[6.,7.,8.],[9.,10.,11.],[12.,13.,14.]])
         pass
 
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test27(self):
+        m0=DenseMatrix(DataArrayDouble([2,3,4,5,1,6]),2,3)
+        m0np=m0.toNumPyMatrix()
+        self.assertEqual(m0np.shape,(2,3))
+        self.assertEqual(m0np.tolist(),[[2.0,3.0,4.0],[5.0,1.0,6.0]])
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test28(self):
+        """Test on DataArrayBytes"""
+        # use case 1
+        d=DataArrayByte(256)
+        for i in range(len(d)):
+            d[i]=-128+i
+            pass
+        arr=d.toNumPyArray()
+        for i in range(len(d)):
+            self.assertEqual(int(arr[i]),-128+i)
+            pass
+        d[0]=7
+        self.assertEqual(int(arr[0]),7)
+        arr[0]=8
+        self.assertEqual(int(d.getIJ(0,0)),8)
+        del arr
+        gc.collect()
+        del d
+        gc.collect()
+        # use case 2
+        d=DataArrayByte(256)
+        for i in range(len(d)):
+            d[i]=-128+i
+            pass
+        arr=d.toNumPyArray()
+        for i in range(len(d)):
+            self.assertEqual(int(arr[i]),-128+i)
+            pass
+        del d
+        gc.collect()
+        del arr
+        gc.collect()
+        # use case 3
+        d=DataArrayByte(256)
+        for i in range(len(d)):
+            d[i]=-128+i
+            pass
+        arr1=d.toNumPyArray()
+        arr2=d.toNumPyArray()
+        arr3=d.toNumPyArray()
+        d[0]=10
+        self.assertEqual(int(arr1[0]),10) ; self.assertEqual(int(arr2[0]),10) ; self.assertEqual(int(arr3[0]),10)
+        arr2[0]=15 ; self.assertEqual(int(d.getIJ(0,0)),15) ; self.assertEqual(int(arr1[0]),15) ; self.assertEqual(int(arr3[0]),15)
+        arr1[0]=-128
+        for i in range(len(d)):
+            self.assertEqual(int(arr1[i]),-128+i)
+            self.assertEqual(int(arr2[i]),-128+i)
+            self.assertEqual(int(arr3[i]),-128+i)
+            pass
+        del arr2
+        gc.collect()
+        for i in range(len(d)):
+            self.assertEqual(int(arr1[i]),-128+i)
+            self.assertEqual(int(arr3[i]),-128+i)
+            pass
+        del arr1
+        gc.collect()
+        for i in range(len(d)):
+            self.assertEqual(int(arr3[i]),-128+i)
+            pass
+        del arr3
+        gc.collect()
+        # use case 4
+        arr=array(0,dtype=int8)
+        arr.resize(256)
+        for i in range(256):
+            arr[i]=-128+i
+            pass
+        d=DataArrayByte(arr)
+        for i in range(256):
+            self.assertEqual(int(d.getIJ(i,0)),-128+i)
+            pass
+        del arr
+        gc.collect()
+        del d
+        gc.collect()
+        # use case 5
+        arr=array(0,dtype=int8)
+        arr.resize(256)
+        for i in range(256):
+            arr[i]=-128+i
+            pass
+        d=DataArrayByte(arr)
+        for i in range(256):
+            self.assertEqual(int(d.getIJ(i,0)),-128+i)
+            pass
+        del d
+        gc.collect()
+        del arr
+        gc.collect()
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test29(self):
+        """Same as test9 with float32"""
+        sz=20
+        a=array(0,dtype=float32)
+        a.resize(sz)
+        a[:]=4
+        self.assertEqual(getrefcount(a),2)
+        a=a.cumsum(dtype=float32)
+        self.assertEqual(getrefcount(a),2)
+        d=DataArrayFloat(a)
+        d[:]=2
+        #
+        e=DataArrayFloat(sz) ; e.fillWithValue(2)
+        self.assertTrue(d.isEqual(e,1e-7))
+        #
+        a[:]=4 ; e.fillWithValue(4)
+        self.assertTrue(d.isEqual(e,1e-7))
+        pass
+    
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test30(self):
+        """Same as test10 with float32"""
+        sz=20
+        a=array(0,dtype=float32)
+        a.resize(sz,2)
+        self.assertEqual(getrefcount(a),2)
+        b=a.reshape(2*sz)
+        self.assertEqual(getrefcount(a),3)
+        self.assertEqual(getrefcount(b),2)
+        b[:]=5
+        d=DataArrayFloat(b)
+        #
+        e=DataArrayFloat(sz*2) ; e.fillWithValue(5)
+        self.assertTrue(d.isEqual(e,1e-7))
+        pass
+    
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test31(self):
+        """Same as test11 with float32"""
+        sz=10
+        a=array(0,dtype=float32)
+        a.resize(sz,2)
+        b=a.reshape(2*sz)
+        c=a.reshape(2,sz)
+        b[:]=6
+        b[7:17]=7
+        d=DataArrayFloat(b)
+        self.assertTrue(d.isEqual(DataArrayFloat([6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,6,6,6]),1e-7))
+        #
+        a=zeros((10,2),dtype=float32)
+        b=a.T
+        c=b.view()
+        a.shape=20
+        a[3:]=10.
+        d=DataArrayFloat(a)
+        self.assertTrue(d.isEqual(DataArrayFloat([0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]),1e-7))
+        pass
+    
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test32(self):
+        """Same as test12 with float32"""
+        a=zeros(20,dtype=float32)
+        b = a[::-1]
+        self.assertRaises(InterpKernelException,DataArrayFloat.New,b) # b is not contiguous in memory
+        pass
+    
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test33(self):
+        """Same as test13 with float32"""
+        a=arange(20,dtype=float32)
+        self.assertEqual(weakref.getweakrefcount(a),0)
+        d=DataArrayFloat(a)
+        self.assertEqual(weakref.getweakrefcount(a),1)
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(d.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
+        self.assertEqual(len(d),20)
+        a[:]=2 # modifying a and d because a and d share the same chunk of data
+        self.assertTrue(d.isUniform(2,1e-7))
+        del d # d is destroyed, a retrieves its ownership of its initial chunk of data
+        ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
+        import gc
+        gc.collect()
+        self.assertTrue(a.flags["OWNDATA"])
+        a[:]=4 # a can be used has usual
+        self.assertTrue(DataArrayFloat(a).isUniform(4,1e-7))
+        pass
+    
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test34(self):
+        """Same as test14 with float32"""
+        a=arange(20,dtype=float32)
+        d=DataArrayFloat(a) # d owns data of a
+        e=DataArrayFloat(a) # a not owned -> e only an access to chunk of a 
+        self.assertTrue(d.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
+        self.assertTrue(e.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
+        a[:]=6
+        self.assertTrue(d.isUniform(6,1e-7))
+        self.assertTrue(e.isUniform(6,1e-7))
+        del a # a destroyed -> d no change because owned and e array is has no more data set
+        ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
+        import gc
+        gc.collect()
+        self.assertTrue(d.isUniform(6,1e-7))
+        self.assertTrue(not e.isAllocated())
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test35(self):
+        """Same as test15 with float32"""
+        a=array(0,dtype=float32) ; a.resize(10,2)
+        b=a.reshape(20)
+        c=a.reshape(2,10)
+        d=DataArrayFloat(b) # d owns data of a
+        e=DataArrayFloat(b) # a not owned -> e only an access to chunk of a
+        f=DataArrayFloat(b) # a not owned -> e only an access to chunk of a
+        del d # d removed -> a ownes again data
+        ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
+        import gc
+        gc.collect()
+        self.assertTrue(e.isUniform(0,1e-7))
+        e[:]=6
+        self.assertTrue(e.isUniform(6,1e-7))
+        self.assertTrue(f.isUniform(6,1e-7))
+        self.assertEqual(b.tolist(),[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6])
+        self.assertEqual(a.tolist(),[[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6]])
+        b[:]=arange(20)
+        del b # no impact on e and f because a is the base of a.
+        ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
+        gc.collect()
+        self.assertTrue(f.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
+        self.assertTrue(e.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
+        del a # a destroyed, but as c has its base set to a, a exists -> e and f not allocated
+        ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
+        gc.collect()
+        self.assertTrue(f.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
+        self.assertTrue(e.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
+        del c # c killed -> a killed -> e and d are put into not allocated state
+        ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
+        gc.collect()
+        self.assertTrue(not e.isAllocated())
+        self.assertTrue(not f.isAllocated())
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test36(self):
+        """Same as test16 with float32"""
+        a=arange(20,dtype=float32)
+        self.assertTrue(a.flags["OWNDATA"])
+        d=DataArrayFloat(a) # d owns data of a
+        self.assertTrue(not a.flags["OWNDATA"])
+        d.pushBackSilent(20)# d pushBack so release of chunk of data -> a becomes owner of its data again
+        self.assertTrue(a.flags["OWNDATA"])
+        self.assertTrue(d.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]),1e-7))
+        self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test37(self):
+        """Same as test20 with float32"""
+        sz=20
+        a=array(0,dtype=float32)
+        a.resize(sz//2,2)
+        a[:]=4
+        self.assertEqual(getrefcount(a),2)
+        d=DataArrayFloat(a)
+        self.assertEqual(10,d.getNumberOfTuples())
+        self.assertEqual(2,d.getNumberOfComponents())
+        self.assertEqual(sz,d.getNbOfElems())
+        self.assertTrue(d.isEqual(DataArrayFloat([(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.)]),1e-7))
+        a[:]=7
+        self.assertTrue(d.isEqual(DataArrayFloat([(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.)]),1e-7))
+        #
+        b=a.reshape((2,5,2))
+        self.assertRaises(InterpKernelException,DataArrayFloat.New,b) # b has not dimension in [0,1] !
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test38(self):
+        """Same as test22 with float32"""
+        d=DataArrayFloat(10)
+        d.iota()
+        a=d.toNumPyArray()
+        self.assertTrue(not a.flags["OWNDATA"])
+        del d
+        gc.collect()
+        self.assertTrue(a.flags["OWNDATA"])
+        self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        #
+        d=DataArrayInt(10)
+        d.iota()
+        a=d.toNumPyArray()
+        self.assertTrue(not a.flags["OWNDATA"])
+        del d
+        gc.collect()
+        self.assertTrue(a.flags["OWNDATA"])
+        self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test39(self):
+        """Same as test23 with float32"""
+        d=DataArrayFloat(10)
+        d.iota()
+        a=d.toNumPyArray()
+        b=d.toNumPyArray()
+        c=d.toNumPyArray()
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(not b.flags["OWNDATA"])
+        self.assertTrue(not c.flags["OWNDATA"])
+        self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertEqual(c.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        del d
+        gc.collect()
+        self.assertTrue(a.flags["OWNDATA"])
+        self.assertTrue(not b.flags["OWNDATA"])
+        self.assertTrue(not c.flags["OWNDATA"])
+        self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertEqual(c.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        #
+        d=DataArrayInt(10)
+        d.iota()
+        a=d.toNumPyArray()
+        b=d.toNumPyArray()
+        c=d.toNumPyArray()
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(not b.flags["OWNDATA"])
+        self.assertTrue(not c.flags["OWNDATA"])
+        self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        self.assertEqual(c.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        del d
+        gc.collect()
+        self.assertTrue(a.flags["OWNDATA"])
+        self.assertTrue(not b.flags["OWNDATA"])
+        self.assertTrue(not c.flags["OWNDATA"])
+        self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        self.assertEqual(c.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test40(self):
+        """Same as test24 with float32"""
+        d=DataArrayFloat(10)
+        d.iota()
+        a=d.toNumPyArray()
+        self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(a.base is None)
+        del a
+        gc.collect()
+        a=d.toNumPyArray()
+        self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(a.base is None)
+        b=d.toNumPyArray()
+        self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(not b.flags["OWNDATA"])
+        self.assertTrue(b.base is a)
+        del a
+        gc.collect()
+        self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertTrue(not b.flags["OWNDATA"])
+        del d
+        gc.collect()
+        self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertTrue(not b.flags["OWNDATA"])
+        #
+        d=DataArrayInt(10)
+        d.iota()
+        a=d.toNumPyArray()
+        self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(a.base is None)
+        del a
+        gc.collect()
+        a=d.toNumPyArray()
+        self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(a.base is None)
+        b=d.toNumPyArray()
+        self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
+        self.assertTrue(not a.flags["OWNDATA"])
+        self.assertTrue(not b.flags["OWNDATA"])
+        self.assertTrue(b.base is a)
+        del a
+        gc.collect()
+        self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertTrue(not b.flags["OWNDATA"])
+        del d
+        gc.collect()
+        self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
+        self.assertTrue(not b.flags["OWNDATA"])
+        pass
+
     def setUp(self):
         pass
     pass