homocomputeris
homocomputeris

Reputation: 509

How to zip a 2D and a 1D array row-wise in Julia?

How do I zip a two-dimensional array with a "vector" row-wise in Julia?

This

X = [1 2; 3 4]
ndims(X)
Y = [-1 -2]
ndims(Y)
first(zip(X,Y))

gives (1, -1) while I want to get ([1 2], -1).

Upvotes: 3

Views: 946

Answers (2)

homocomputeris
homocomputeris

Reputation: 509

There are iterator builders in Julia: eachrow and eachcol, which work for arrays and are concise (at least in this case):

X = [1 2; 3 4]
Y = [-1 -2]
z = zip(eachrow(X), eachcol(Y))

Then

for el in z
    print(el)
end

gives

([1, 2], [-1])
([3, 4], [-2])

Upvotes: 2

Cameron Bieganek
Cameron Bieganek

Reputation: 7674

If you're ok with using column-vectors for the input and output, then you can use the eachrow function, which iterates over the rows of a matrix and returns the rows as column-vectors:

julia> X = [1 2; 3 4];

julia> Y = [-1, -2];

julia> collect(zip(eachrow(X), Y))
2-element Array{Tuple{Array{Int64,1},Int64},1}:
 ([1, 2], -1)
 ([3, 4], -2)

On the other hand, if you need the first elements of your zipped tuples to be row-vectors (as is shown in your question), then you could convert your matrix into a vector of rows and then use zip:

julia> X = [1 2; 3 4];

julia> Y = [-1 -2];

julia> rows = [X[[i], :] for i in 1:size(X, 1)]
2-element Array{Array{Int64,2},1}:
 [1 2]
 [3 4]

julia> collect(zip(rows, Y))
2-element Array{Tuple{Array{Int64,2},Int64},1}:
 ([1 2], -1)
 ([3 4], -2)

Note that I've used X[[i], :] inside the comprehension instead of X[i, :], so that we get an array of rows rather than an array of column-vectors.

Finally, just to be clear, note that Y = [-1 -2] produces a row-vector. We usually represent vectors as column vectors:

julia> Y = [-1, -2]
2-element Array{Int64,1}:
 -1
 -2

Upvotes: 3

Related Questions