Kyan Posted March 19, 2013 Share Posted March 19, 2013 Hi, I'm trying to add columns from existing arrays to spare time and perhaps memory when reading it I have 3 arrays (with the same size) and want to put them togheter by columns (the inverse of _ArrayUnique function) is it possible? (and fast?) Here's a example of _ArrayUnique(): #include <Array.au3> Dim $aArray[6][2] = [[1, "A"],[2, "B"],[3, "C"],[1, "A"],[2, "B"],[3, "C"]] _ArrayDisplay($aArray, "$aArray") $aNewArray = _ArrayUnique($aArray) ;Using Default Parameters _ArrayDisplay($aNewArray, "$aNewArray represents the 1st Dimension of $aArray") $aNewArray = _ArrayUnique($aArray, 2) ;Using 2nd Dimension _ArrayDisplay($aNewArray, "$aNewArray represents the 2nd Dimension of $aArray") thanks in advance Heroes, there is no such thing One day I'll discover what IE.au3 has of special for so many users using it.C'mon there's InetRead and WinHTTP, way better Link to comment Share on other sites More sharing options...
Affe Posted March 19, 2013 Share Posted March 19, 2013 I think you're confused as to what "_ArrayUnique()" does. If I'm guessing correctly, you want to take three arrays and concatenate them. You could do this by declaring a fourth, new array, with the number of columns needed, and insert each element in like this: Dim $array_1[5][2] = [[1, "A"], [2, "B"], [3, "C"], [4, "D"], [5, "E"]] Dim $array_2[5][2] = [[1, "A"], [2, "B"], [3, "C"], [4, "D"], [5, "E"]] Dim $array_3[5][2] = [[1, "A"], [2, "B"], [3, "C"], [4, "D"], [5, "E"]] Dim $new_array[5][6] ;5 rows and 6 columns to hold both columns from each array above For $x = 0 To 4 $new_array[$x][0] = $array_1[$x][0] $new_array[$x][1] = $array_1[$x][1] $new_array[$x][2] = $array_2[$x][0] $new_array[$x][3] = $array_2[$x][1] $new_array[$x][4] = $array_3[$x][0] $new_array[$x][5] = $array_4[$x][1] Next [center][/center] Link to comment Share on other sites More sharing options...
czardas Posted March 19, 2013 Share Posted March 19, 2013 Use Redim to add columns to a 2 dimensional array. operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
Kyan Posted March 20, 2013 Author Share Posted March 20, 2013 (edited) I think you're confused as to what "_ArrayUnique()" does. If I'm guessing correctly, you want to take three arrays and concatenate them. You could do this by declaring a fourth, new array, with the number of columns needed, and insert each element in like this: Dim $array_1[5][2] = [[1, "A"], [2, "B"], [3, "C"], [4, "D"], [5, "E"]] Dim $array_2[5][2] = [[1, "A"], [2, "B"], [3, "C"], [4, "D"], [5, "E"]] Dim $array_3[5][2] = [[1, "A"], [2, "B"], [3, "C"], [4, "D"], [5, "E"]] Dim $new_array[5][6] ;5 rows and 6 columns to hold both columns from each array above For $x = 0 To 4 $new_array[$x][0] = $array_1[$x][0] $new_array[$x][1] = $array_1[$x][1] $new_array[$x][2] = $array_2[$x][0] $new_array[$x][3] = $array_2[$x][1] $new_array[$x][4] = $array_3[$x][0] $new_array[$x][5] = $array_4[$x][1] Next Hi, thanks for help me out Thats what I want to do, there ins't a faster way of doing it? I'm leading with 4 arrays (1D) with less than 100 rows, and what I want is put them in one 2D array [n][4] (as in your example) Edited March 20, 2013 by DiOgO Heroes, there is no such thing One day I'll discover what IE.au3 has of special for so many users using it.C'mon there's InetRead and WinHTTP, way better Link to comment Share on other sites More sharing options...
kylomas Posted March 21, 2013 Share Posted March 21, 2013 (edited) DiOgO, Thats what I want to do, there ins't a faster way of doing it? Time it and I think you'll fiind that it runs in less than .001 secs. Here's a function that accepts up to 10 1D arrays of any size and produces a 2D array... expandcollapse popup#include <array.au3> local $a[20] = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0] local $b[10] = [1,2,3,4,5,6,7,8,9,0] local $c[50] = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0] local $d[5] = [1,2,3,4,5] local $e[7] = [1,2,3,4,5,6,7] local $f[15] = ['abc',9.333,' ','a1b5d7'] local $st=timerinit() $a10 = _array_combine($a,$b,$c,$d,$e,$f) ConsoleWrite(@error & @LF) ConsoleWrite(round(TimerDiff($st)/1000,4) & ' seconds' & @LF) _arraydisplay($a10) func _array_combine($arr1,$arr2,$arr3=0,$arr4=0,$arr5=0,$arr6=0,$arr7=0,$arr8=0,$arr9=0,$arr10=0) ; at least two arrays required if not IsArray($arr1) or not IsArray($arr2) then return seterror(1,0,0) ; determine how many arrays passed to function and make sure that they are 1D for $1 = 1 to 10 if not isarray(eval("arr" & $1)) then ExitLoop if ubound(eval("arr" & $1),0) > 1 then return seterror(2,0,0) Next local $num_cols = $1 - 1 local $max_elements = 0 ; detrmine max # of rows for $1 = 1 to $num_cols if ubound(eval("arr" & $1)) > $max_elements then $max_elements = ubound(eval("arr" & $1)) next ; define and ppopulate target array local $aTarget[$max_elements][$num_cols+1], $aTemp for $1 = 0 to $num_cols $aTemp = eval("arr" & $1+1) for $2 = 0 to ubound($aTemp) - 1 $aTarget[$2][$1] = $aTemp[$2] Next next return $aTarget endfunc kylomas edit: runs in .0005 secs Edited March 21, 2013 by kylomas Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
kylomas Posted March 21, 2013 Share Posted March 21, 2013 Affe, The code you posted does not run. I changed it as follows: Local $st = TimerInit() Local $array_1[5][2] = [[1, "A"],[2, "B"],[3, "C"],[4, "D"],[5, "E"]] Local $array_2[5][2] = [[1, "A"],[2, "B"],[3, "C"],[4, "D"],[5, "E"]] Local $array_3[5][2] = [[1, "A"],[2, "B"],[3, "C"],[4, "D"],[5, "E"]] Local $array_4[5][2] = [[1, "A"],[2, "B"],[3, "C"],[4, "D"],[5, "E"]] Local $array_5[5][2] = [[1, "A"],[2, "B"],[3, "C"],[4, "D"],[5, "E"]] Local $new_array[5][6] ;5 rows and 6 columns to hold both columns from each array above For $x = 0 To 4 $new_array[$x][0] = $array_1[$x][0] $new_array[$x][1] = $array_1[$x][1] $new_array[$x][2] = $array_2[$x][0] $new_array[$x][3] = $array_2[$x][1] $new_array[$x][4] = $array_3[$x][0] $new_array[$x][5] = $array_4[$x][1] Next ConsoleWrite(round(TimerDiff($st)/1000,4) & ' seconds' & @LF) kylomas Kyan 1 Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
Kyan Posted March 21, 2013 Author Share Posted March 21, 2013 DiOgO, Time it and I think you'll fiind that it runs in less than .001 secs. Here's a function that accepts up to 10 1D arrays of any size and produces a 2D array... expandcollapse popup#include <array.au3> local $a[20] = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0] local $b[10] = [1,2,3,4,5,6,7,8,9,0] local $c[50] = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0] local $d[5] = [1,2,3,4,5] local $e[7] = [1,2,3,4,5,6,7] local $f[15] = ['abc',9.333,' ','a1b5d7'] local $st=timerinit() $a10 = _array_combine($a,$b,$c,$d,$e,$f) ConsoleWrite(@error & @LF) ConsoleWrite(round(TimerDiff($st)/1000,4) & ' seconds' & @LF) _arraydisplay($a10) func _array_combine($arr1,$arr2,$arr3=0,$arr4=0,$arr5=0,$arr6=0,$arr7=0,$arr8=0,$arr9=0,$arr10=0) ; at least two arrays required if not IsArray($arr1) or not IsArray($arr2) then return seterror(1,0,0) ; determine how many arrays passed to function and make sure that they are 1D for $1 = 1 to 10 if not isarray(eval("arr" & $1)) then ExitLoop if ubound(eval("arr" & $1),0) > 1 then return seterror(2,0,0) Next local $num_cols = $1 - 1 local $max_elements = 0 ; detrmine max # of rows for $1 = 1 to $num_cols if ubound(eval("arr" & $1)) > $max_elements then $max_elements = ubound(eval("arr" & $1)) next ; define and ppopulate target array local $aTarget[$max_elements][$num_cols+1], $aTemp for $1 = 0 to $num_cols $aTemp = eval("arr" & $1+1) for $2 = 0 to ubound($aTemp) - 1 $aTarget[$2][$1] = $aTemp[$2] Next next return $aTarget endfunc kylomas edit: runs in .0005 secs Hi kylomas, I lost how many times you helped me pretty impressive, i have one question, in your function, when a variable is not a array it continues: if not isarray(eval("arr" & $1)) then ExitLoop, shouldn't be a seterror(..) in stead of ExitLoop? Heroes, there is no such thing One day I'll discover what IE.au3 has of special for so many users using it.C'mon there's InetRead and WinHTTP, way better Link to comment Share on other sites More sharing options...
kylomas Posted March 21, 2013 Share Posted March 21, 2013 DiOgO,i have one question, in your function, when a variable is not a array it continues: if not isarray(eval("arr" & $1)) then ExitLoop, shouldn't be a seterror(..) in stead of ExitLoop?No, this loop counts the number of vars passed to the function that are arrays. When it encounters a non-array variable it exits the loop and begins the process of creating the combined array.kylomas Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
Kyan Posted March 22, 2013 Author Share Posted March 22, 2013 DiOgO,No, this loop counts the number of vars passed to the function that are arrays. When it encounters a non-array variable it exits the loop and begins the process of creating the combined array.kylomasso, it stop when a non arrays is encountered since it have at least 2 arrays to "merge" without aborting all the process, nice thought Heroes, there is no such thing One day I'll discover what IE.au3 has of special for so many users using it.C'mon there's InetRead and WinHTTP, way better Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now