How to efficiently unroll a matrix by value with numpy?How to merge two dictionaries in a single expression?How do I check if a list is empty?How do I check whether a file exists without exceptions?How do I check if an array includes an object in JavaScript?How to append something to an array?How do I sort a dictionary by value?How do I determine whether an array contains a particular value in Java?How do I list all files of a directory?How do I remove a particular element from an array in JavaScript?How to use foreach with array in JavaScript?

How is the claim "I am in New York only if I am in America" the same as "If I am in New York, then I am in America?

strTok function (thread safe, supports empty tokens, doesn't change string)

What does the "remote control" for a QF-4 look like?

Can I ask the recruiters in my resume to put the reason why I am rejected?

Are astronomers waiting to see something in an image from a gravitational lens that they've already seen in an adjacent image?

How can I make my BBEG immortal short of making them a Lich or Vampire?

How to format long polynomial?

What defenses are there against being summoned by the Gate spell?

Is it unprofessional to ask if a job posting on GlassDoor is real?

Can an x86 CPU running in real mode be considered to be basically an 8086 CPU?

dbcc cleantable batch size explanation

Why is 150k or 200k jobs considered good when there's 300k+ births a month?

A newer friend of my brother's gave him a load of baseball cards that are supposedly extremely valuable. Is this a scam?

How is it possible to have an ability score that is less than 3?

Why does Kotter return in Welcome Back Kotter?

"You are your self first supporter", a more proper way to say it

What is a clear way to write a bar that has an extra beat?

Do I have a twin with permutated remainders?

What does it mean to describe someone as a butt steak?

What's the output of a record needle playing an out-of-speed record

Languages that we cannot (dis)prove to be Context-Free

Why can't I see bouncing of a switch on an oscilloscope?

Malcev's paper "On a class of homogeneous spaces" in English

How to draw a waving flag in TikZ



How to efficiently unroll a matrix by value with numpy?


How to merge two dictionaries in a single expression?How do I check if a list is empty?How do I check whether a file exists without exceptions?How do I check if an array includes an object in JavaScript?How to append something to an array?How do I sort a dictionary by value?How do I determine whether an array contains a particular value in Java?How do I list all files of a directory?How do I remove a particular element from an array in JavaScript?How to use foreach with array in JavaScript?






.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
    7 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
    7 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
    7 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
    7 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
7 hours ago





It would be better if you explain it in detail.

– Marios Nikolaou
7 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
    4 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
    4 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
    4 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
    4 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
    4 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
4 hours ago





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

– Paul Panzer
4 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

Dapidodigma demeter Subspecies | Notae | Tabula navigationisDapidodigmaAfrotropical Butterflies: Lycaenidae - Subtribe IolainaAmplifica

Constantinus Vanšenkin Nexus externi | Tabula navigationisБольшая российская энциклопедияAmplifica

Gaius Norbanus Flaccus (consul 38 a.C.n.) Index De gente | De cursu honorum | Notae | Fontes | Si vis plura legere | Tabula navigationisHic legere potes