1. Average of 2-D array

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?

new topic     » topic index » view message » categorize

2. Re: Average of 2-D array

irv said...

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?

new topic     » goto parent     » topic index » view message » categorize

3. Re: Average of 2-D array

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.

new topic     » goto parent     » topic index » view message » categorize

4. Re: Average of 2-D array

irv said...

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.

new topic     » goto parent     » topic index » view message » categorize

5. Re: Average of 2-D array

jimcbrown said...

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.

new topic     » goto parent     » topic index » view message » categorize

6. Re: Average of 2-D array

irv said...

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.

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu