1. Average of 2-D array
- Posted by irv May 31, 2015
- 1453 views
I have a two-dimensional sequence of integers (100 in all, arranged 10x10).
Let's call it x.
I can get math:sum(x) easily, it adds them up regardless of nesting. But stats:average(x) doesn't work that way.
I could get the average by dividing the sum by 100,but who knows if the array will always be that size? length(x) does not return the actual number of elements, it returns 10.
/usr/local/share/euphoria/include/std/stats.e:490 in function sum() type_check failure, result_ is {1,2,3,4,5,6,7,8,9,10}
Am I overlooking a function in either math or stats? Or a function to get the actual number of elements in the array?
2. Re: Average of 2-D array
- Posted by jimcbrown (admin) May 31, 2015
- 1467 views
I have a two-dimensional sequence of integers (100 in all, arranged 10x10).
Let's call it x.
I can get math:sum(x) easily, it adds them up regardless of nesting. But stats:average(x) doesn't work that way.
I could get the average by dividing the sum by 100,but who knows if the array will always be that size? length(x) does not return the actual number of elements, it returns 10.
/usr/local/share/euphoria/include/std/stats.e:490 in function sum() type_check failure, result_ is {1,2,3,4,5,6,7,8,9,10}
Am I overlooking a function in either math or stats? Or a function to get the actual number of elements in the array?
If you want it to average the atoms regardless of nesting, why not use stdseq:flatten() to create a sequence of atoms (with no nesting) and then call stats:average() on that?
3. Re: Average of 2-D array
- Posted by irv May 31, 2015
- 1455 views
flatten() works, of course. I was just surprised by the fact that sum() can handle the array on its own, but apparently fails when sum() is called by average().
Seems inconsistent somehow.
4. Re: Average of 2-D array
- Posted by jimcbrown (admin) May 31, 2015
- 1451 views
flatten() works, of course. I was just surprised by the fact that sum() can handle the array on its own, but apparently fails when sum() is called by average().
Seems inconsistent somehow.
Maybe this is a bug... average() won't fail but just return an incorrect answer.
5. Re: Average of 2-D array
- Posted by irv May 31, 2015
- 1450 views
Maybe this is a bug... average() won't fail but just return an incorrect answer.
Technically, you're correct. average doesn't fail, it causes sum to fail with a type-check error, even though sum can handle the array when it's passed directly.
/usr/local/share/euphoria/include/std/stats.e:490 in function sum() type_check failure, result_ is {1,2,3,4,5,6,7,8,9,10}
The 'array' being passed looks like this (yep. elementary-school multiplication tables)
{ {1,2,3,4,5,6,7,8,9,10}, {2,4,6,8,10,12,14,16,18,20}, {3,6,9,12,15,18,21,24,27,30}, {4,8,12,16,20,24,28,32,36,40}, {5,10,15,20,25,30,35,40,45,50}, {6,12,18,24,30,36,42,48,54,60}, {7,14,21,28,35,42,49,56,63,70}, {8,16,24,32,40,48,56,64,72,80}, {9,18,27,36,45,54,63,72,81,90}, {10,20,30,40,50,60,70,80,90,100} }
? sum(x) gives 3025
average(x) gives the error message above.
And, just wondering, but has no one ever needed the total number of elements in a nested sequence? I can write a function to do that, probably should be recursive, but it seems like something that should already exist.
6. Re: Average of 2-D array
- Posted by DerekParnell (admin) Jun 15, 2015
- 1354 views
I have a two-dimensional sequence of integers (100 in all, arranged 10x10).
Let's call it x.
I can get math:sum(x) easily, it adds them up regardless of nesting. But stats:average(x) doesn't work that way.
I could get the average by dividing the sum by 100,but who knows if the array will always be that size? length(x) does not return the actual number of elements, it returns 10.
/usr/local/share/euphoria/include/std/stats.e:490 in function sum() type_check failure, result_ is {1,2,3,4,5,6,7,8,9,10}
Am I overlooking a function in either math or stats? Or a function to get the actual number of elements in the array?
No, you are not overlooking anything. The function you'd like to use is not in the standard library. If it did, it would look a lot like ...
public function count(object a) atom b if atom(a) then return 1 end if b = 0 for i = 1 to length(a) do if atom(a[i]) then b += 1 else b += count(a[i]) end if end for return b end function
The average() function fails because it calls the stats:sum() function and not the maths:sum() function. Even though they have the same name, they have different purposes. The one in the stats library is designed for lists that may contain strings, which are incidental to the statistical requirements, such as a cell in a spreadsheet might have non-numeric data.