How to get/set elements in a numpy matrix by multiple indices without for-loop?
For example, suppose we have
a = zeros((5,5))
Then I want to set elements at positions (1,2), (3,4), (0,3) as 1,2,3 respectively at the same time, but the following would not work,
# I expect this to be the same as a[(1,2)] = 1, a[(3,4)] = 2, a[(0,3)] = 3
a[[(1,2),(3,4),(0,3)]] = [1,2,3]
It will complain "too many indices for array". I do not want to involve a for-loop for efficiency concern (the real problem is a large matrix and I need to set or get elements in that matrix with a long list of randomly generated indexes).
python numpy
add a comment |
For example, suppose we have
a = zeros((5,5))
Then I want to set elements at positions (1,2), (3,4), (0,3) as 1,2,3 respectively at the same time, but the following would not work,
# I expect this to be the same as a[(1,2)] = 1, a[(3,4)] = 2, a[(0,3)] = 3
a[[(1,2),(3,4),(0,3)]] = [1,2,3]
It will complain "too many indices for array". I do not want to involve a for-loop for efficiency concern (the real problem is a large matrix and I need to set or get elements in that matrix with a long list of randomly generated indexes).
python numpy
1
You want, in way or other, to index witha[[1,3,0], [2,4,3)]]
, in other words, a list (or array) of thei
indices, and another of thej
indices. This is, effectively, a transpose of your list of size 2 tuples.
– hpaulj
Jan 1 at 0:08
add a comment |
For example, suppose we have
a = zeros((5,5))
Then I want to set elements at positions (1,2), (3,4), (0,3) as 1,2,3 respectively at the same time, but the following would not work,
# I expect this to be the same as a[(1,2)] = 1, a[(3,4)] = 2, a[(0,3)] = 3
a[[(1,2),(3,4),(0,3)]] = [1,2,3]
It will complain "too many indices for array". I do not want to involve a for-loop for efficiency concern (the real problem is a large matrix and I need to set or get elements in that matrix with a long list of randomly generated indexes).
python numpy
For example, suppose we have
a = zeros((5,5))
Then I want to set elements at positions (1,2), (3,4), (0,3) as 1,2,3 respectively at the same time, but the following would not work,
# I expect this to be the same as a[(1,2)] = 1, a[(3,4)] = 2, a[(0,3)] = 3
a[[(1,2),(3,4),(0,3)]] = [1,2,3]
It will complain "too many indices for array". I do not want to involve a for-loop for efficiency concern (the real problem is a large matrix and I need to set or get elements in that matrix with a long list of randomly generated indexes).
python numpy
python numpy
edited Dec 31 '18 at 23:33
Tony
asked Dec 31 '18 at 23:27
TonyTony
292311
292311
1
You want, in way or other, to index witha[[1,3,0], [2,4,3)]]
, in other words, a list (or array) of thei
indices, and another of thej
indices. This is, effectively, a transpose of your list of size 2 tuples.
– hpaulj
Jan 1 at 0:08
add a comment |
1
You want, in way or other, to index witha[[1,3,0], [2,4,3)]]
, in other words, a list (or array) of thei
indices, and another of thej
indices. This is, effectively, a transpose of your list of size 2 tuples.
– hpaulj
Jan 1 at 0:08
1
1
You want, in way or other, to index with
a[[1,3,0], [2,4,3)]]
, in other words, a list (or array) of the i
indices, and another of the j
indices. This is, effectively, a transpose of your list of size 2 tuples.– hpaulj
Jan 1 at 0:08
You want, in way or other, to index with
a[[1,3,0], [2,4,3)]]
, in other words, a list (or array) of the i
indices, and another of the j
indices. This is, effectively, a transpose of your list of size 2 tuples.– hpaulj
Jan 1 at 0:08
add a comment |
1 Answer
1
active
oldest
votes
You can do the following:
import numpy as np
rows, cols = zip(*[(1, 2), (3, 4), (0, 3)])
a = np.zeros((5,5))
a[rows, cols] = [1, 2, 3]
print(a)
Output
[[0. 0. 0. 3. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 2.]
[0. 0. 0. 0. 0.]]
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53992114%2fhow-to-get-set-elements-in-a-numpy-matrix-by-multiple-indices-without-for-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can do the following:
import numpy as np
rows, cols = zip(*[(1, 2), (3, 4), (0, 3)])
a = np.zeros((5,5))
a[rows, cols] = [1, 2, 3]
print(a)
Output
[[0. 0. 0. 3. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 2.]
[0. 0. 0. 0. 0.]]
add a comment |
You can do the following:
import numpy as np
rows, cols = zip(*[(1, 2), (3, 4), (0, 3)])
a = np.zeros((5,5))
a[rows, cols] = [1, 2, 3]
print(a)
Output
[[0. 0. 0. 3. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 2.]
[0. 0. 0. 0. 0.]]
add a comment |
You can do the following:
import numpy as np
rows, cols = zip(*[(1, 2), (3, 4), (0, 3)])
a = np.zeros((5,5))
a[rows, cols] = [1, 2, 3]
print(a)
Output
[[0. 0. 0. 3. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 2.]
[0. 0. 0. 0. 0.]]
You can do the following:
import numpy as np
rows, cols = zip(*[(1, 2), (3, 4), (0, 3)])
a = np.zeros((5,5))
a[rows, cols] = [1, 2, 3]
print(a)
Output
[[0. 0. 0. 3. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 2.]
[0. 0. 0. 0. 0.]]
answered Dec 31 '18 at 23:36
Daniel MesejoDaniel Mesejo
18.3k21431
18.3k21431
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53992114%2fhow-to-get-set-elements-in-a-numpy-matrix-by-multiple-indices-without-for-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
You want, in way or other, to index with
a[[1,3,0], [2,4,3)]]
, in other words, a list (or array) of thei
indices, and another of thej
indices. This is, effectively, a transpose of your list of size 2 tuples.– hpaulj
Jan 1 at 0:08