How to efficiently unroll a matrix by value with numpy?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







6















I have a matrix M with values 0 through N within it. I'd like to unroll this matrix to create a new matrix A where each submatrix A[i, :, :] represents whether or not M == i.



The solution below uses a loop.



# Example Setup
import numpy as np

np.random.seed(0)
N = 5
M = np.random.randint(0, N, size=(5,5))

# Solution with Loop
A = np.zeros((N, M.shape[0], M.shape[1]))
for i in range(N):
A[i, :, :] = M == i


This yields:



M
array([[4, 0, 3, 3, 3],
[1, 3, 2, 4, 0],
[0, 4, 2, 1, 0],
[1, 1, 0, 1, 4],
[3, 0, 3, 0, 2]])

M.shape
# (5, 5)


A
array([[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0]],
...
[[1, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]])

A.shape
# (5, 5, 5)


Is there a faster way, or a way to do it in a single numpy operation?










share|improve this question

























  • It would be better if you explain it in detail.

    – Marios Nikolaou
    6 hours ago






  • 2





    @MariosNikolaou just copy/paste his code and print(M);print(A)...I edited it for you though

    – Reedinationer
    6 hours ago













  • @Reedinationer i did it.

    – Marios Nikolaou
    6 hours ago











  • I would not recommend pasting output for this code as the input is randomised without a seed.

    – coldspeed
    6 hours ago






  • 1





    i == M compare int with array 5x5 ? and then save it in A?

    – Marios Nikolaou
    6 hours ago


















6















I have a matrix M with values 0 through N within it. I'd like to unroll this matrix to create a new matrix A where each submatrix A[i, :, :] represents whether or not M == i.



The solution below uses a loop.



# Example Setup
import numpy as np

np.random.seed(0)
N = 5
M = np.random.randint(0, N, size=(5,5))

# Solution with Loop
A = np.zeros((N, M.shape[0], M.shape[1]))
for i in range(N):
A[i, :, :] = M == i


This yields:



M
array([[4, 0, 3, 3, 3],
[1, 3, 2, 4, 0],
[0, 4, 2, 1, 0],
[1, 1, 0, 1, 4],
[3, 0, 3, 0, 2]])

M.shape
# (5, 5)


A
array([[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0]],
...
[[1, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]])

A.shape
# (5, 5, 5)


Is there a faster way, or a way to do it in a single numpy operation?










share|improve this question

























  • It would be better if you explain it in detail.

    – Marios Nikolaou
    6 hours ago






  • 2





    @MariosNikolaou just copy/paste his code and print(M);print(A)...I edited it for you though

    – Reedinationer
    6 hours ago













  • @Reedinationer i did it.

    – Marios Nikolaou
    6 hours ago











  • I would not recommend pasting output for this code as the input is randomised without a seed.

    – coldspeed
    6 hours ago






  • 1





    i == M compare int with array 5x5 ? and then save it in A?

    – Marios Nikolaou
    6 hours ago














6












6








6








I have a matrix M with values 0 through N within it. I'd like to unroll this matrix to create a new matrix A where each submatrix A[i, :, :] represents whether or not M == i.



The solution below uses a loop.



# Example Setup
import numpy as np

np.random.seed(0)
N = 5
M = np.random.randint(0, N, size=(5,5))

# Solution with Loop
A = np.zeros((N, M.shape[0], M.shape[1]))
for i in range(N):
A[i, :, :] = M == i


This yields:



M
array([[4, 0, 3, 3, 3],
[1, 3, 2, 4, 0],
[0, 4, 2, 1, 0],
[1, 1, 0, 1, 4],
[3, 0, 3, 0, 2]])

M.shape
# (5, 5)


A
array([[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0]],
...
[[1, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]])

A.shape
# (5, 5, 5)


Is there a faster way, or a way to do it in a single numpy operation?










share|improve this question
















I have a matrix M with values 0 through N within it. I'd like to unroll this matrix to create a new matrix A where each submatrix A[i, :, :] represents whether or not M == i.



The solution below uses a loop.



# Example Setup
import numpy as np

np.random.seed(0)
N = 5
M = np.random.randint(0, N, size=(5,5))

# Solution with Loop
A = np.zeros((N, M.shape[0], M.shape[1]))
for i in range(N):
A[i, :, :] = M == i


This yields:



M
array([[4, 0, 3, 3, 3],
[1, 3, 2, 4, 0],
[0, 4, 2, 1, 0],
[1, 1, 0, 1, 4],
[3, 0, 3, 0, 2]])

M.shape
# (5, 5)


A
array([[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0]],
...
[[1, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]])

A.shape
# (5, 5, 5)


Is there a faster way, or a way to do it in a single numpy operation?







python arrays numpy






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 6 hours ago









coldspeed

140k24156241




140k24156241










asked 7 hours ago









seveibarseveibar

1,29211225




1,29211225













  • It would be better if you explain it in detail.

    – Marios Nikolaou
    6 hours ago






  • 2





    @MariosNikolaou just copy/paste his code and print(M);print(A)...I edited it for you though

    – Reedinationer
    6 hours ago













  • @Reedinationer i did it.

    – Marios Nikolaou
    6 hours ago











  • I would not recommend pasting output for this code as the input is randomised without a seed.

    – coldspeed
    6 hours ago






  • 1





    i == M compare int with array 5x5 ? and then save it in A?

    – Marios Nikolaou
    6 hours ago



















  • It would be better if you explain it in detail.

    – Marios Nikolaou
    6 hours ago






  • 2





    @MariosNikolaou just copy/paste his code and print(M);print(A)...I edited it for you though

    – Reedinationer
    6 hours ago













  • @Reedinationer i did it.

    – Marios Nikolaou
    6 hours ago











  • I would not recommend pasting output for this code as the input is randomised without a seed.

    – coldspeed
    6 hours ago






  • 1





    i == M compare int with array 5x5 ? and then save it in A?

    – Marios Nikolaou
    6 hours ago

















It would be better if you explain it in detail.

– Marios Nikolaou
6 hours ago





It would be better if you explain it in detail.

– Marios Nikolaou
6 hours ago




2




2





@MariosNikolaou just copy/paste his code and print(M);print(A)...I edited it for you though

– Reedinationer
6 hours ago







@MariosNikolaou just copy/paste his code and print(M);print(A)...I edited it for you though

– Reedinationer
6 hours ago















@Reedinationer i did it.

– Marios Nikolaou
6 hours ago





@Reedinationer i did it.

– Marios Nikolaou
6 hours ago













I would not recommend pasting output for this code as the input is randomised without a seed.

– coldspeed
6 hours ago





I would not recommend pasting output for this code as the input is randomised without a seed.

– coldspeed
6 hours ago




1




1





i == M compare int with array 5x5 ? and then save it in A?

– Marios Nikolaou
6 hours ago





i == M compare int with array 5x5 ? and then save it in A?

– Marios Nikolaou
6 hours ago












3 Answers
3






active

oldest

votes


















6














You can make use of some broadcasting here:



P = np.arange(N)
Y = np.broadcast_to(P[:, None], M.shape)
T = np.equal(M, Y[:, None]).astype(int)




Alternative using indices:



X, Y = np.indices(M.shape)
Z = np.equal(M, X[:, None]).astype(int)





share|improve this answer


























  • This answer was really helpful towards my understanding of broadcasting, thank you!

    – seveibar
    4 hours ago



















6














Broadcasted comparison is your friend:



B = (M[None, :] == np.arange(N)[:, None, None]).view(np.int8)

np.array_equal(A, B)
# True


The idea is to expand the dimensions in such a way that the comparison can be broadcasted in the manner desired.





As pointed out by @Alex Riley in the comments, you can use np.equal.outer to avoid having to do the indexing stuff yourself,



B = np.equal.outer(np.arange(N), M).view(np.int8)

np.array_equal(A, B)
# True





share|improve this answer





















  • 1





    Good answer - just to point out there's a superfluous newaxis in your indexing for M (resulting in a 4D array). You could use M[None, :] instead to get the 3D array. An alternative to avoid fiddly indexing is to use np.equal.outer(np.arange(N), M).view(np.int8).

    – Alex Riley
    6 hours ago













  • @AlexRiley Thanks for that! And the outer solution is quite neat.

    – coldspeed
    6 hours ago



















3














You can index into the identity matrix like so



 A = np.identity(N, int)[:, M]


or so



 A = np.identity(N, int)[M.T].T


Or use the new (v1.15.0) put_along_axis



A = np.zeros((N,5,5), int)
np.put_along_axis(A, M[None], 1, 0)


Note if N is much larger than 5 then creating an NxN identity matrix may be considered wasteful. We can mitigate this using stride tricks:



def read_only_identity(N, dtype=float):
z = np.zeros(2*N-1, dtype)
s, = z.strides
z[N-1] = 1
return np.lib.stride_tricks.as_strided(z[N-1:], (N, N), (-s, s))





share|improve this answer





















  • 1





    This is great, really interesting answer.

    – user3483203
    5 hours ago






  • 1





    Hi Paul, this answer is really elegant, but the identity answers seem specific to the case where the N=M.shape[0]=M.shape[1]. Is the solution similarly elegant for N=/=M.shape[0]=/=M.shape[1]? Thanks for the answer, learning a lot!

    – seveibar
    4 hours ago






  • 1





    @seveibar I've updated the answer. It is really just a matter of replacing the correct 5s with Ns.

    – Paul Panzer
    3 hours ago












Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55543949%2fhow-to-efficiently-unroll-a-matrix-by-value-with-numpy%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























3 Answers
3






active

oldest

votes








3 Answers
3






active

oldest

votes









active

oldest

votes






active

oldest

votes









6














You can make use of some broadcasting here:



P = np.arange(N)
Y = np.broadcast_to(P[:, None], M.shape)
T = np.equal(M, Y[:, None]).astype(int)




Alternative using indices:



X, Y = np.indices(M.shape)
Z = np.equal(M, X[:, None]).astype(int)





share|improve this answer


























  • This answer was really helpful towards my understanding of broadcasting, thank you!

    – seveibar
    4 hours ago
















6














You can make use of some broadcasting here:



P = np.arange(N)
Y = np.broadcast_to(P[:, None], M.shape)
T = np.equal(M, Y[:, None]).astype(int)




Alternative using indices:



X, Y = np.indices(M.shape)
Z = np.equal(M, X[:, None]).astype(int)





share|improve this answer


























  • This answer was really helpful towards my understanding of broadcasting, thank you!

    – seveibar
    4 hours ago














6












6








6







You can make use of some broadcasting here:



P = np.arange(N)
Y = np.broadcast_to(P[:, None], M.shape)
T = np.equal(M, Y[:, None]).astype(int)




Alternative using indices:



X, Y = np.indices(M.shape)
Z = np.equal(M, X[:, None]).astype(int)





share|improve this answer















You can make use of some broadcasting here:



P = np.arange(N)
Y = np.broadcast_to(P[:, None], M.shape)
T = np.equal(M, Y[:, None]).astype(int)




Alternative using indices:



X, Y = np.indices(M.shape)
Z = np.equal(M, X[:, None]).astype(int)






share|improve this answer














share|improve this answer



share|improve this answer








edited 6 hours ago

























answered 6 hours ago









user3483203user3483203

31.8k82857




31.8k82857













  • This answer was really helpful towards my understanding of broadcasting, thank you!

    – seveibar
    4 hours ago



















  • This answer was really helpful towards my understanding of broadcasting, thank you!

    – seveibar
    4 hours ago

















This answer was really helpful towards my understanding of broadcasting, thank you!

– seveibar
4 hours ago





This answer was really helpful towards my understanding of broadcasting, thank you!

– seveibar
4 hours ago













6














Broadcasted comparison is your friend:



B = (M[None, :] == np.arange(N)[:, None, None]).view(np.int8)

np.array_equal(A, B)
# True


The idea is to expand the dimensions in such a way that the comparison can be broadcasted in the manner desired.





As pointed out by @Alex Riley in the comments, you can use np.equal.outer to avoid having to do the indexing stuff yourself,



B = np.equal.outer(np.arange(N), M).view(np.int8)

np.array_equal(A, B)
# True





share|improve this answer





















  • 1





    Good answer - just to point out there's a superfluous newaxis in your indexing for M (resulting in a 4D array). You could use M[None, :] instead to get the 3D array. An alternative to avoid fiddly indexing is to use np.equal.outer(np.arange(N), M).view(np.int8).

    – Alex Riley
    6 hours ago













  • @AlexRiley Thanks for that! And the outer solution is quite neat.

    – coldspeed
    6 hours ago
















6














Broadcasted comparison is your friend:



B = (M[None, :] == np.arange(N)[:, None, None]).view(np.int8)

np.array_equal(A, B)
# True


The idea is to expand the dimensions in such a way that the comparison can be broadcasted in the manner desired.





As pointed out by @Alex Riley in the comments, you can use np.equal.outer to avoid having to do the indexing stuff yourself,



B = np.equal.outer(np.arange(N), M).view(np.int8)

np.array_equal(A, B)
# True





share|improve this answer





















  • 1





    Good answer - just to point out there's a superfluous newaxis in your indexing for M (resulting in a 4D array). You could use M[None, :] instead to get the 3D array. An alternative to avoid fiddly indexing is to use np.equal.outer(np.arange(N), M).view(np.int8).

    – Alex Riley
    6 hours ago













  • @AlexRiley Thanks for that! And the outer solution is quite neat.

    – coldspeed
    6 hours ago














6












6








6







Broadcasted comparison is your friend:



B = (M[None, :] == np.arange(N)[:, None, None]).view(np.int8)

np.array_equal(A, B)
# True


The idea is to expand the dimensions in such a way that the comparison can be broadcasted in the manner desired.





As pointed out by @Alex Riley in the comments, you can use np.equal.outer to avoid having to do the indexing stuff yourself,



B = np.equal.outer(np.arange(N), M).view(np.int8)

np.array_equal(A, B)
# True





share|improve this answer















Broadcasted comparison is your friend:



B = (M[None, :] == np.arange(N)[:, None, None]).view(np.int8)

np.array_equal(A, B)
# True


The idea is to expand the dimensions in such a way that the comparison can be broadcasted in the manner desired.





As pointed out by @Alex Riley in the comments, you can use np.equal.outer to avoid having to do the indexing stuff yourself,



B = np.equal.outer(np.arange(N), M).view(np.int8)

np.array_equal(A, B)
# True






share|improve this answer














share|improve this answer



share|improve this answer








edited 6 hours ago

























answered 6 hours ago









coldspeedcoldspeed

140k24156241




140k24156241








  • 1





    Good answer - just to point out there's a superfluous newaxis in your indexing for M (resulting in a 4D array). You could use M[None, :] instead to get the 3D array. An alternative to avoid fiddly indexing is to use np.equal.outer(np.arange(N), M).view(np.int8).

    – Alex Riley
    6 hours ago













  • @AlexRiley Thanks for that! And the outer solution is quite neat.

    – coldspeed
    6 hours ago














  • 1





    Good answer - just to point out there's a superfluous newaxis in your indexing for M (resulting in a 4D array). You could use M[None, :] instead to get the 3D array. An alternative to avoid fiddly indexing is to use np.equal.outer(np.arange(N), M).view(np.int8).

    – Alex Riley
    6 hours ago













  • @AlexRiley Thanks for that! And the outer solution is quite neat.

    – coldspeed
    6 hours ago








1




1





Good answer - just to point out there's a superfluous newaxis in your indexing for M (resulting in a 4D array). You could use M[None, :] instead to get the 3D array. An alternative to avoid fiddly indexing is to use np.equal.outer(np.arange(N), M).view(np.int8).

– Alex Riley
6 hours ago







Good answer - just to point out there's a superfluous newaxis in your indexing for M (resulting in a 4D array). You could use M[None, :] instead to get the 3D array. An alternative to avoid fiddly indexing is to use np.equal.outer(np.arange(N), M).view(np.int8).

– Alex Riley
6 hours ago















@AlexRiley Thanks for that! And the outer solution is quite neat.

– coldspeed
6 hours ago





@AlexRiley Thanks for that! And the outer solution is quite neat.

– coldspeed
6 hours ago











3














You can index into the identity matrix like so



 A = np.identity(N, int)[:, M]


or so



 A = np.identity(N, int)[M.T].T


Or use the new (v1.15.0) put_along_axis



A = np.zeros((N,5,5), int)
np.put_along_axis(A, M[None], 1, 0)


Note if N is much larger than 5 then creating an NxN identity matrix may be considered wasteful. We can mitigate this using stride tricks:



def read_only_identity(N, dtype=float):
z = np.zeros(2*N-1, dtype)
s, = z.strides
z[N-1] = 1
return np.lib.stride_tricks.as_strided(z[N-1:], (N, N), (-s, s))





share|improve this answer





















  • 1





    This is great, really interesting answer.

    – user3483203
    5 hours ago






  • 1





    Hi Paul, this answer is really elegant, but the identity answers seem specific to the case where the N=M.shape[0]=M.shape[1]. Is the solution similarly elegant for N=/=M.shape[0]=/=M.shape[1]? Thanks for the answer, learning a lot!

    – seveibar
    4 hours ago






  • 1





    @seveibar I've updated the answer. It is really just a matter of replacing the correct 5s with Ns.

    – Paul Panzer
    3 hours ago
















3














You can index into the identity matrix like so



 A = np.identity(N, int)[:, M]


or so



 A = np.identity(N, int)[M.T].T


Or use the new (v1.15.0) put_along_axis



A = np.zeros((N,5,5), int)
np.put_along_axis(A, M[None], 1, 0)


Note if N is much larger than 5 then creating an NxN identity matrix may be considered wasteful. We can mitigate this using stride tricks:



def read_only_identity(N, dtype=float):
z = np.zeros(2*N-1, dtype)
s, = z.strides
z[N-1] = 1
return np.lib.stride_tricks.as_strided(z[N-1:], (N, N), (-s, s))





share|improve this answer





















  • 1





    This is great, really interesting answer.

    – user3483203
    5 hours ago






  • 1





    Hi Paul, this answer is really elegant, but the identity answers seem specific to the case where the N=M.shape[0]=M.shape[1]. Is the solution similarly elegant for N=/=M.shape[0]=/=M.shape[1]? Thanks for the answer, learning a lot!

    – seveibar
    4 hours ago






  • 1





    @seveibar I've updated the answer. It is really just a matter of replacing the correct 5s with Ns.

    – Paul Panzer
    3 hours ago














3












3








3







You can index into the identity matrix like so



 A = np.identity(N, int)[:, M]


or so



 A = np.identity(N, int)[M.T].T


Or use the new (v1.15.0) put_along_axis



A = np.zeros((N,5,5), int)
np.put_along_axis(A, M[None], 1, 0)


Note if N is much larger than 5 then creating an NxN identity matrix may be considered wasteful. We can mitigate this using stride tricks:



def read_only_identity(N, dtype=float):
z = np.zeros(2*N-1, dtype)
s, = z.strides
z[N-1] = 1
return np.lib.stride_tricks.as_strided(z[N-1:], (N, N), (-s, s))





share|improve this answer















You can index into the identity matrix like so



 A = np.identity(N, int)[:, M]


or so



 A = np.identity(N, int)[M.T].T


Or use the new (v1.15.0) put_along_axis



A = np.zeros((N,5,5), int)
np.put_along_axis(A, M[None], 1, 0)


Note if N is much larger than 5 then creating an NxN identity matrix may be considered wasteful. We can mitigate this using stride tricks:



def read_only_identity(N, dtype=float):
z = np.zeros(2*N-1, dtype)
s, = z.strides
z[N-1] = 1
return np.lib.stride_tricks.as_strided(z[N-1:], (N, N), (-s, s))






share|improve this answer














share|improve this answer



share|improve this answer








edited 4 hours ago

























answered 5 hours ago









Paul PanzerPaul Panzer

31.5k21845




31.5k21845








  • 1





    This is great, really interesting answer.

    – user3483203
    5 hours ago






  • 1





    Hi Paul, this answer is really elegant, but the identity answers seem specific to the case where the N=M.shape[0]=M.shape[1]. Is the solution similarly elegant for N=/=M.shape[0]=/=M.shape[1]? Thanks for the answer, learning a lot!

    – seveibar
    4 hours ago






  • 1





    @seveibar I've updated the answer. It is really just a matter of replacing the correct 5s with Ns.

    – Paul Panzer
    3 hours ago














  • 1





    This is great, really interesting answer.

    – user3483203
    5 hours ago






  • 1





    Hi Paul, this answer is really elegant, but the identity answers seem specific to the case where the N=M.shape[0]=M.shape[1]. Is the solution similarly elegant for N=/=M.shape[0]=/=M.shape[1]? Thanks for the answer, learning a lot!

    – seveibar
    4 hours ago






  • 1





    @seveibar I've updated the answer. It is really just a matter of replacing the correct 5s with Ns.

    – Paul Panzer
    3 hours ago








1




1





This is great, really interesting answer.

– user3483203
5 hours ago





This is great, really interesting answer.

– user3483203
5 hours ago




1




1





Hi Paul, this answer is really elegant, but the identity answers seem specific to the case where the N=M.shape[0]=M.shape[1]. Is the solution similarly elegant for N=/=M.shape[0]=/=M.shape[1]? Thanks for the answer, learning a lot!

– seveibar
4 hours ago





Hi Paul, this answer is really elegant, but the identity answers seem specific to the case where the N=M.shape[0]=M.shape[1]. Is the solution similarly elegant for N=/=M.shape[0]=/=M.shape[1]? Thanks for the answer, learning a lot!

– seveibar
4 hours ago




1




1





@seveibar I've updated the answer. It is really just a matter of replacing the correct 5s with Ns.

– Paul Panzer
3 hours ago





@seveibar I've updated the answer. It is really just a matter of replacing the correct 5s with Ns.

– Paul Panzer
3 hours ago


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55543949%2fhow-to-efficiently-unroll-a-matrix-by-value-with-numpy%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

SQL Server 17 - Attemping to backup to remote NAS but Access is denied

Always On Availability groups resolving state after failover - Remote harden of transaction...

Restoring from pg_dump with foreign key constraints