Re: function to check if array is empty
- To: mathgroup at smc.vnet.net
- Subject: [mg88456] Re: function to check if array is empty
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Mon, 5 May 2008 06:18:04 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <fvbr6d$plc$1@smc.vnet.net> <4819F79D.4020907@gmail.com> <481E27AC.10008@gmail.com>
Jean-Marc Gulliet wrote: > Jean-Marc Gulliet wrote: > >> will parr wrote: >> >>> is there a function that will check if an array is empty? >>> i'm looking for a function to return either True (or 1), or False (or >>> 0) when it checks an array. eg: >>> X = Array[0 &, {3, 3}] >>> >>> then test with function (called ArrayEmpty, for example) >>> >>> In: ArrayEmpty[X] >>> >>> Out: True >> >> If you deal only with m x n rectangular arrays (matrices) you could use >> >> ArrayEmptyQ[arr_List] := MatrixQ[arr, (# == 0 &)] >> >> A more general function would be >> >> ArrayEmptyQ[arr_List] := >> If[Count[arr, x_ /; x != 0, -1] != 0, False, True] >> >> For instance, >> >> X = Array[0 &, {3, 3}] >> ArrayEmptyQ[arr_List] := MatrixQ[arr, (# == 0 &)] >> ArrayEmptyQ[X] >> X[[1, 2]] = 1; >> X >> ArrayEmptyQ[X] >> >> {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}} >> >> True >> >> {{0, 1, 0}, {0, 0, 0}, {0, 0, 0}} >> >> False > > If speed is important, using *Total* and *Unitize* (to prevent > cancellation of terms with same magnitude but opposite signs) will be > faster than the above solution. > > In[1]:= X = Array[0 &, {3, 3}] > ArrayEmptyQ[arr_List] := Total[Unitize[arr], Infinity] == 0 > ArrayEmptyQ[X] > X[[1, 2]] = 1; X[[1, 3]] = -1; > X > ArrayEmptyQ[X] > X = Array[0 &, {1000, 1000}]; > Timing@ArrayEmptyQ[X] > > Out[1]= {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}} > > Out[3]= True > > Out[5]= {{0, 1, -1}, {0, 0, 0}, {0, 0, 0}} > > Out[6]= False > > Out[8]= {0.015834, True} > > In[9]:= Total[X, -1] == 0 > > Out[9]= True > > In[10]:= X = Array[0 &, {3, 3}] > ArrayEmptyQ[arr_List] := MatrixQ[arr, (# == 0 &)] > ArrayEmptyQ[X] > X[[1, 2]] = 1; X[[1, 3]] = -1; > X > ArrayEmptyQ[X] > X = Array[0 &, {1000, 1000}]; > Timing@ArrayEmptyQ[X] > > Out[10]= {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}} > > Out[12]= True > > Out[14]= {{0, 1, -1}, {0, 0, 0}, {0, 0, 0}} > > Out[15]= False > > Out[17]= {0.714124, True} Of course, if we know before hand that the list is made of non-negative elements only (or non-positive only), we can discard the *Unitize* function, so the resulting function is faster. In[1]:= X = Array[0 &, {3, 3}] ArrayEmptyQ[arr_List] := Total[arr, -1] == 0 ArrayEmptyQ[X] X[[1, 2]] = 1; X[[1, 3]] = -1; X ArrayEmptyQ[X] X = Array[0 &, {1000, 1000}]; Timing@ArrayEmptyQ[X] Out[1]= {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}} Out[3]= True Out[5]= {{0, 1, -1}, {0, 0, 0}, {0, 0, 0}} Out[6]= True Out[8]= {0.009338, True} -- Jean-Marc