# Possibly heterogeneous (values can be of different types)
typeof((2, 'a', 1.0, "test"))
Tuple{Int64, Char, Float64, String}
Marie-Hélène Burle
Values can be stored in collections. This workshop introduces tuples, dictionaries, sets, and arrays in Julia.
Tuples are immutable, indexable, and possibly heterogeneous collections of elements. The order of elements matters.
Tuple{Int64, Char, Float64, String}
LoadError: MethodError: no method matching setindex!(::Tuple{Int64, Char, Float64, String}, ::Int64, ::Int64)
MethodError: no method matching setindex!(::Tuple{Int64, Char, Float64, String}, ::Int64, ::Int64)
Stacktrace:
[1] top-level scope
@ In[4]:3
Tuples can have named components:
Julia also has dictionaries: associative collections of key/value pairs:
Dict{String, Any} with 3 entries:
"Index" => 0.3
"Age" => 52
"Name" => "Roger"
"Name"
, "Age"
, and "Index"
are the keys; "Roger"
, 52
, and 0.3
are the values.
The =>
operator is the same as the Pair
function:
Dictionaries can be heterogeneous (as in this example) and the order doesn’t matter. They are also indexable:
And mutable (they can be modified):
Sets are collections without duplicates. The order of elements doesn’t matter.
Notice how this is a set of 5 (and not 6) elements: the duplicated 8 didn’t matter.
You can compare sets:
Set{Int64} with 7 elements:
4
7
2
10
9
8
3
Set{Int64} with 1 element:
2
# The setdiff is the set of elements that are in the first set but not in the second
# Note that the order matters here
setdiff(set1, set2)
Set{Int64} with 4 elements:
4
7
9
8
Sets can be heterogeneous:
Unidimensional arrays in Julia are called vectors.
These 3 syntaxes are equivalent:
These 4 syntaxes are equivalent:
Elements separated by semi-colons or end of lines get expanded vertically.
Those separated by commas do not get expanded.
Elements separated by spaces or tabs get expanded horizontally.
Your turn:
Compare the outputs of the following:
In Julia, arrays can be heterogeneous:
This is possible because all elements of an array, no matter of what types, will always sit below the Any
type in the type hierarchy.
Below are examples of some of the functions initializing arrays:
2×3×4 Array{Float64, 3}:
[:, :, 1] =
0.70497 0.452224 0.210217
0.152121 0.808499 0.748643
[:, :, 2] =
0.964218 0.533504 0.295138
0.530122 0.705078 0.448783
[:, :, 3] =
0.101024 0.702216 0.351094
0.451474 0.643441 0.193529
[:, :, 4] =
0.365804 0.593161 0.213761
0.908817 0.669264 0.160509
2×3×4 Array{Int64, 3}:
[:, :, 1] =
-808940715765468093 -1584927078315600374 -5301199987516324173
-6596392331988765638 -6192885842242193678 1889096344742778536
[:, :, 2] =
-1263311441971715837 -398863679696473412 425946792632171343
-8887634749817674030 -6532441838130849674 -5790650878322099032
[:, :, 3] =
-3504949663976209361 -7056126120819890696 9014204101180695865
5444915959299197671 7453311557699154449 -7332672815187269775
[:, :, 4] =
-1027239353605623832 8546329529560148599 5006263260814316361
3614836023227257818 -380255779183739001 9031894209972587885
To apply a function to each element of a collection rather than to the collection as a whole, Julia uses broadcasting.
LoadError: MethodError: no method matching abs(::Vector{Int64})
This doesn’t work because the function abs
only applies to single elements.
By broadcasting abs
, you apply it to each element of a
:
The dot notation is equivalent:
It can also be applied to the pipe, to unary and binary operators, etc.
Your turn:
Try to understand the difference between the following 2 expressions:
Hint: 0/1 are a short-form notations for false/true in arrays of Booleans.
Julia has an array comprehension syntax similar to Python’s:
As in other mathematically oriented languages such as R, Julia starts indexing at 1
.
Indexing is done with square brackets:
Your turn:
Index the element on the 3rd row and 2nd column of b
:
Your turn:
How can I get the second column?
How can I get the tuple (2, 4)
? (a tuple is a list of elements)
As in Python, by default, arrays are passed by sharing:
This prevents the unwanted copying of arrays.