Store data from a triple for loop
I have this code that I wrote in MATLAB to store matrices. I was using cells array, but in Python I don't know how to do this.
Would someone know how can I do this?
The MATLAB code is:
S =[0.5 0.7 0.9 1.1]; % distância entre tx e rx[m]
d = 0.2*ones(1,10);
h = [ 0 0.1 0.2 0.3 0.4]
n_cam = length(d); % numero de camadas
n_alt = length(h); % numero de alturas
n_S = length(S); % numero de receptores
z = zeros(n_cam,n_alt); % profundidade
Rv_h = zeros(n_S,n_alt);
Rv_v = zeros(n_S,n_alt);
Rv = zeros(n_cam,n_alt);
Rh = zeros(n_cam,n_alt);
S_Rv = cell(1,n_S);
S_Rh = cell(1,n_S);
sigma = 0.3*ones(1,n_cam);
sigmaah = zeros(n_S,n_alt);
for i = 1:n_S
for j = 1:n_alt
for k = 1:n_cam
z(k,j)= (sum(d(1:k))+h(j))/S(i);
Rv(k,j) = 1/((4*z(k,j)^2+1)^0.5);
Rh(k,j) = ((4*z(k,j)^2+1)^0.5)-2*z(k,j);
end
Rv_h(i,j) = 1/((4*(h(j)/S(i))^2+1)^0.5);
Rh_h(i,j)=((4*(h(j)/S(i))^2+1)^0.5)-2*(h(j)/S(i));
end
S_Rv(:,i) = {Rv}; % z para cada camada em cada altura, para cada S
S_Rh(:,i) = {Rh};
end
for i = 1:n_S
for j = 1:n_alt
Rv = cell2mat(S_Rv(1,i));
Rh = cell2mat(S_Rh(1,i));
sigma_ah = sigma(1)*(Rh_h(i,j)-Rh(1,j));
sigma_av = sigma(1)*(Rv_h(i,j)-Rv(1,j));
for k = 2:(n_cam-1)
sigma_ah_ant = sigma_ah;
sigma_av_ant = sigma_av;
sigma_ah = sigma_ah_ant + sigma(k)*(Rh(k-1,j)-Rh(k,j));
sigma_av = sigma_av_ant + sigma(k)*(Rv(k-1,j)-Rv(k,j));
end
sigmaah (i,j) = sigma_ah + sigma(end)*Rh(n_cam-1,j)
sigmaav (i,j) = sigma_av + sigma(end)*Rv(n_cam-1,j)
end
end
I was thinking that in Python I could do something like:
n_S = 4
n_alt = 9
n_cam = 6
Rv =
for i in range(1,n_S):
for j in range(1,n_alt):
for k in range(1,n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i]
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
But it is not working, the error message I get is "list index out of range".
python arrays matlab for-loop storing-data
|
show 1 more comment
I have this code that I wrote in MATLAB to store matrices. I was using cells array, but in Python I don't know how to do this.
Would someone know how can I do this?
The MATLAB code is:
S =[0.5 0.7 0.9 1.1]; % distância entre tx e rx[m]
d = 0.2*ones(1,10);
h = [ 0 0.1 0.2 0.3 0.4]
n_cam = length(d); % numero de camadas
n_alt = length(h); % numero de alturas
n_S = length(S); % numero de receptores
z = zeros(n_cam,n_alt); % profundidade
Rv_h = zeros(n_S,n_alt);
Rv_v = zeros(n_S,n_alt);
Rv = zeros(n_cam,n_alt);
Rh = zeros(n_cam,n_alt);
S_Rv = cell(1,n_S);
S_Rh = cell(1,n_S);
sigma = 0.3*ones(1,n_cam);
sigmaah = zeros(n_S,n_alt);
for i = 1:n_S
for j = 1:n_alt
for k = 1:n_cam
z(k,j)= (sum(d(1:k))+h(j))/S(i);
Rv(k,j) = 1/((4*z(k,j)^2+1)^0.5);
Rh(k,j) = ((4*z(k,j)^2+1)^0.5)-2*z(k,j);
end
Rv_h(i,j) = 1/((4*(h(j)/S(i))^2+1)^0.5);
Rh_h(i,j)=((4*(h(j)/S(i))^2+1)^0.5)-2*(h(j)/S(i));
end
S_Rv(:,i) = {Rv}; % z para cada camada em cada altura, para cada S
S_Rh(:,i) = {Rh};
end
for i = 1:n_S
for j = 1:n_alt
Rv = cell2mat(S_Rv(1,i));
Rh = cell2mat(S_Rh(1,i));
sigma_ah = sigma(1)*(Rh_h(i,j)-Rh(1,j));
sigma_av = sigma(1)*(Rv_h(i,j)-Rv(1,j));
for k = 2:(n_cam-1)
sigma_ah_ant = sigma_ah;
sigma_av_ant = sigma_av;
sigma_ah = sigma_ah_ant + sigma(k)*(Rh(k-1,j)-Rh(k,j));
sigma_av = sigma_av_ant + sigma(k)*(Rv(k-1,j)-Rv(k,j));
end
sigmaah (i,j) = sigma_ah + sigma(end)*Rh(n_cam-1,j)
sigmaav (i,j) = sigma_av + sigma(end)*Rv(n_cam-1,j)
end
end
I was thinking that in Python I could do something like:
n_S = 4
n_alt = 9
n_cam = 6
Rv =
for i in range(1,n_S):
for j in range(1,n_alt):
for k in range(1,n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i]
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
But it is not working, the error message I get is "list index out of range".
python arrays matlab for-loop storing-data
There are several variables (or functions, not sure which) that you don't appear to define (at least in this code snippet):z
andd
being among them. Also, what do you mean by "it's not working?" Are there specific error messages you see?
– Jonah Bishop
Nov 15 '18 at 15:21
missingz
d
h
S
definitions. Also as @JonahBishop said, what is 'not working'?
– krflol
Nov 15 '18 at 15:24
I didn't put all code...d = 0.2*ones(1,10), h = [ 0 0.1 0.2 0.3 0.4] z is calculate from d and h
– Jeniffer Barreto
Nov 15 '18 at 15:31
Well put all the code so we can help you.
– antfuentes87
Nov 15 '18 at 15:35
@antfuentes87 done! =)
– Jeniffer Barreto
Nov 15 '18 at 15:42
|
show 1 more comment
I have this code that I wrote in MATLAB to store matrices. I was using cells array, but in Python I don't know how to do this.
Would someone know how can I do this?
The MATLAB code is:
S =[0.5 0.7 0.9 1.1]; % distância entre tx e rx[m]
d = 0.2*ones(1,10);
h = [ 0 0.1 0.2 0.3 0.4]
n_cam = length(d); % numero de camadas
n_alt = length(h); % numero de alturas
n_S = length(S); % numero de receptores
z = zeros(n_cam,n_alt); % profundidade
Rv_h = zeros(n_S,n_alt);
Rv_v = zeros(n_S,n_alt);
Rv = zeros(n_cam,n_alt);
Rh = zeros(n_cam,n_alt);
S_Rv = cell(1,n_S);
S_Rh = cell(1,n_S);
sigma = 0.3*ones(1,n_cam);
sigmaah = zeros(n_S,n_alt);
for i = 1:n_S
for j = 1:n_alt
for k = 1:n_cam
z(k,j)= (sum(d(1:k))+h(j))/S(i);
Rv(k,j) = 1/((4*z(k,j)^2+1)^0.5);
Rh(k,j) = ((4*z(k,j)^2+1)^0.5)-2*z(k,j);
end
Rv_h(i,j) = 1/((4*(h(j)/S(i))^2+1)^0.5);
Rh_h(i,j)=((4*(h(j)/S(i))^2+1)^0.5)-2*(h(j)/S(i));
end
S_Rv(:,i) = {Rv}; % z para cada camada em cada altura, para cada S
S_Rh(:,i) = {Rh};
end
for i = 1:n_S
for j = 1:n_alt
Rv = cell2mat(S_Rv(1,i));
Rh = cell2mat(S_Rh(1,i));
sigma_ah = sigma(1)*(Rh_h(i,j)-Rh(1,j));
sigma_av = sigma(1)*(Rv_h(i,j)-Rv(1,j));
for k = 2:(n_cam-1)
sigma_ah_ant = sigma_ah;
sigma_av_ant = sigma_av;
sigma_ah = sigma_ah_ant + sigma(k)*(Rh(k-1,j)-Rh(k,j));
sigma_av = sigma_av_ant + sigma(k)*(Rv(k-1,j)-Rv(k,j));
end
sigmaah (i,j) = sigma_ah + sigma(end)*Rh(n_cam-1,j)
sigmaav (i,j) = sigma_av + sigma(end)*Rv(n_cam-1,j)
end
end
I was thinking that in Python I could do something like:
n_S = 4
n_alt = 9
n_cam = 6
Rv =
for i in range(1,n_S):
for j in range(1,n_alt):
for k in range(1,n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i]
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
But it is not working, the error message I get is "list index out of range".
python arrays matlab for-loop storing-data
I have this code that I wrote in MATLAB to store matrices. I was using cells array, but in Python I don't know how to do this.
Would someone know how can I do this?
The MATLAB code is:
S =[0.5 0.7 0.9 1.1]; % distância entre tx e rx[m]
d = 0.2*ones(1,10);
h = [ 0 0.1 0.2 0.3 0.4]
n_cam = length(d); % numero de camadas
n_alt = length(h); % numero de alturas
n_S = length(S); % numero de receptores
z = zeros(n_cam,n_alt); % profundidade
Rv_h = zeros(n_S,n_alt);
Rv_v = zeros(n_S,n_alt);
Rv = zeros(n_cam,n_alt);
Rh = zeros(n_cam,n_alt);
S_Rv = cell(1,n_S);
S_Rh = cell(1,n_S);
sigma = 0.3*ones(1,n_cam);
sigmaah = zeros(n_S,n_alt);
for i = 1:n_S
for j = 1:n_alt
for k = 1:n_cam
z(k,j)= (sum(d(1:k))+h(j))/S(i);
Rv(k,j) = 1/((4*z(k,j)^2+1)^0.5);
Rh(k,j) = ((4*z(k,j)^2+1)^0.5)-2*z(k,j);
end
Rv_h(i,j) = 1/((4*(h(j)/S(i))^2+1)^0.5);
Rh_h(i,j)=((4*(h(j)/S(i))^2+1)^0.5)-2*(h(j)/S(i));
end
S_Rv(:,i) = {Rv}; % z para cada camada em cada altura, para cada S
S_Rh(:,i) = {Rh};
end
for i = 1:n_S
for j = 1:n_alt
Rv = cell2mat(S_Rv(1,i));
Rh = cell2mat(S_Rh(1,i));
sigma_ah = sigma(1)*(Rh_h(i,j)-Rh(1,j));
sigma_av = sigma(1)*(Rv_h(i,j)-Rv(1,j));
for k = 2:(n_cam-1)
sigma_ah_ant = sigma_ah;
sigma_av_ant = sigma_av;
sigma_ah = sigma_ah_ant + sigma(k)*(Rh(k-1,j)-Rh(k,j));
sigma_av = sigma_av_ant + sigma(k)*(Rv(k-1,j)-Rv(k,j));
end
sigmaah (i,j) = sigma_ah + sigma(end)*Rh(n_cam-1,j)
sigmaav (i,j) = sigma_av + sigma(end)*Rv(n_cam-1,j)
end
end
I was thinking that in Python I could do something like:
n_S = 4
n_alt = 9
n_cam = 6
Rv =
for i in range(1,n_S):
for j in range(1,n_alt):
for k in range(1,n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i]
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
But it is not working, the error message I get is "list index out of range".
python arrays matlab for-loop storing-data
python arrays matlab for-loop storing-data
edited Nov 15 '18 at 18:29
Cris Luengo
21.8k52252
21.8k52252
asked Nov 15 '18 at 15:19
Jeniffer BarretoJeniffer Barreto
235
235
There are several variables (or functions, not sure which) that you don't appear to define (at least in this code snippet):z
andd
being among them. Also, what do you mean by "it's not working?" Are there specific error messages you see?
– Jonah Bishop
Nov 15 '18 at 15:21
missingz
d
h
S
definitions. Also as @JonahBishop said, what is 'not working'?
– krflol
Nov 15 '18 at 15:24
I didn't put all code...d = 0.2*ones(1,10), h = [ 0 0.1 0.2 0.3 0.4] z is calculate from d and h
– Jeniffer Barreto
Nov 15 '18 at 15:31
Well put all the code so we can help you.
– antfuentes87
Nov 15 '18 at 15:35
@antfuentes87 done! =)
– Jeniffer Barreto
Nov 15 '18 at 15:42
|
show 1 more comment
There are several variables (or functions, not sure which) that you don't appear to define (at least in this code snippet):z
andd
being among them. Also, what do you mean by "it's not working?" Are there specific error messages you see?
– Jonah Bishop
Nov 15 '18 at 15:21
missingz
d
h
S
definitions. Also as @JonahBishop said, what is 'not working'?
– krflol
Nov 15 '18 at 15:24
I didn't put all code...d = 0.2*ones(1,10), h = [ 0 0.1 0.2 0.3 0.4] z is calculate from d and h
– Jeniffer Barreto
Nov 15 '18 at 15:31
Well put all the code so we can help you.
– antfuentes87
Nov 15 '18 at 15:35
@antfuentes87 done! =)
– Jeniffer Barreto
Nov 15 '18 at 15:42
There are several variables (or functions, not sure which) that you don't appear to define (at least in this code snippet):
z
and d
being among them. Also, what do you mean by "it's not working?" Are there specific error messages you see?– Jonah Bishop
Nov 15 '18 at 15:21
There are several variables (or functions, not sure which) that you don't appear to define (at least in this code snippet):
z
and d
being among them. Also, what do you mean by "it's not working?" Are there specific error messages you see?– Jonah Bishop
Nov 15 '18 at 15:21
missing
z
d
h
S
definitions. Also as @JonahBishop said, what is 'not working'?– krflol
Nov 15 '18 at 15:24
missing
z
d
h
S
definitions. Also as @JonahBishop said, what is 'not working'?– krflol
Nov 15 '18 at 15:24
I didn't put all code...d = 0.2*ones(1,10), h = [ 0 0.1 0.2 0.3 0.4] z is calculate from d and h
– Jeniffer Barreto
Nov 15 '18 at 15:31
I didn't put all code...d = 0.2*ones(1,10), h = [ 0 0.1 0.2 0.3 0.4] z is calculate from d and h
– Jeniffer Barreto
Nov 15 '18 at 15:31
Well put all the code so we can help you.
– antfuentes87
Nov 15 '18 at 15:35
Well put all the code so we can help you.
– antfuentes87
Nov 15 '18 at 15:35
@antfuentes87 done! =)
– Jeniffer Barreto
Nov 15 '18 at 15:42
@antfuentes87 done! =)
– Jeniffer Barreto
Nov 15 '18 at 15:42
|
show 1 more comment
2 Answers
2
active
oldest
votes
I would suggest taking use of the broadcasting feature
The loops can then be replaced to clarify the code :
from numpy import array, ones
S =array([0.5, 0.7, 0.9, 1.1])
d = 0.2*ones((10));
h = array([ 0, 0.1, 0.2, 0.3, 0.4])
z = ((d.cumsum()[:, None] + h).ravel() / S[:, None]).reshape((S.size, d.size, h.size))
Rv = 1 / (4 * z ** 2 + 1)** .5
# ...etc
print(Rv[-1])
Which outputs:
[[0.93979342 0.87789557 0.80873608 0.73994007 0.67572463]
[0.80873608 0.73994007 0.67572463 0.61782155 0.56652882]
[0.67572463 0.61782155 0.56652882 0.52145001 0.48191875]
[0.56652882 0.52145001 0.48191875 0.4472136 0.41665471]
[0.48191875 0.4472136 0.41665471 0.38963999 0.36565237]
[0.41665471 0.38963999 0.36565237 0.34425465 0.32507977]
[0.36565237 0.34425465 0.32507977 0.30782029 0.29221854]
[0.32507977 0.30782029 0.29221854 0.27805808 0.26515648]
[0.29221854 0.27805808 0.26515648 0.25335939 0.24253563]
[0.26515648 0.25335939 0.24253563 0.23257321 0.22337616]]
Which overlaps with the computation in octave/matlab:
Rv =
0.93979 0.87790 0.80874 0.73994 0.67572
0.80874 0.73994 0.67572 0.61782 0.56653
0.67572 0.61782 0.56653 0.52145 0.48192
0.56653 0.52145 0.48192 0.44721 0.41665
0.48192 0.44721 0.41665 0.38964 0.36565
0.41665 0.38964 0.36565 0.34425 0.32508
0.36565 0.34425 0.32508 0.30782 0.29222
0.32508 0.30782 0.29222 0.27806 0.26516
0.29222 0.27806 0.26516 0.25336 0.24254
0.26516 0.25336 0.24254 0.23257 0.22338
This reduces the pyramid of doom and is probably faster than the for-loops due to numpy magic.
Edit: formatting
Edit2: gave check
I don't understand the code, works for storing the data, but the Rv result is not the same from matlab... The d.cumsum() goes just until the index it is supposed to?
– Jeniffer Barreto
Nov 15 '18 at 17:55
I had the parenthesis wrong. Edited the code snippet above to match your line. Essentially what how it works is similar to bsxfun in matlab. I am repeatedly doing an operation over the other dimensions. .cumsum() performs the cumutilative sum similar to what you are doing. The only difference is that my results are appended along the third axis. Which you don't use since you are overwriting z matrix.
– GlobalTraveler
Nov 15 '18 at 18:08
Also added confirmation with output of the last iteratons
– GlobalTraveler
Nov 15 '18 at 18:21
thank you very much! works great! this is much ahead of my knowledge in python
– Jeniffer Barreto
Nov 16 '18 at 14:24
No problem. Just be mindful that this is numpy magic and not necessarily python. Numpy arrays are very useful for numerical computations compared to normal lists.
– GlobalTraveler
Nov 16 '18 at 14:26
add a comment |
You need to define z
and Rv
to be 2D and 3D arrays of known size before you do this.
Note also that python (and numpy) arrays are zero-based, so just use range
directly.
Not tested:
import numpy as np
d = 0.2*np.arange(10) ### not sure if this is what you meant
h = np.array([ 0 0.1 0.2 0.3 0.4])
n_S = 4
n_alt = 9
n_cam = 6
Rv = np.zeros((n_S, n_alt, n_cam))
z = np.zeros((n_cam, n_alt))
for i in range(n_S):
for j in range(n_alt):
for k in range(n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i] ## not sure about 0:10
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
However, as @GlobalTraveler points out, the most pythonic/numpyish way to do this is to take advantage of broadcasting and not use a loop at all:
Rv = 1/np.sqrt(4 * z**2 + 1)
your code also works, thank you =)
– Jeniffer Barreto
Nov 16 '18 at 14:25
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%2f53322573%2fstore-data-from-a-triple-for-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
I would suggest taking use of the broadcasting feature
The loops can then be replaced to clarify the code :
from numpy import array, ones
S =array([0.5, 0.7, 0.9, 1.1])
d = 0.2*ones((10));
h = array([ 0, 0.1, 0.2, 0.3, 0.4])
z = ((d.cumsum()[:, None] + h).ravel() / S[:, None]).reshape((S.size, d.size, h.size))
Rv = 1 / (4 * z ** 2 + 1)** .5
# ...etc
print(Rv[-1])
Which outputs:
[[0.93979342 0.87789557 0.80873608 0.73994007 0.67572463]
[0.80873608 0.73994007 0.67572463 0.61782155 0.56652882]
[0.67572463 0.61782155 0.56652882 0.52145001 0.48191875]
[0.56652882 0.52145001 0.48191875 0.4472136 0.41665471]
[0.48191875 0.4472136 0.41665471 0.38963999 0.36565237]
[0.41665471 0.38963999 0.36565237 0.34425465 0.32507977]
[0.36565237 0.34425465 0.32507977 0.30782029 0.29221854]
[0.32507977 0.30782029 0.29221854 0.27805808 0.26515648]
[0.29221854 0.27805808 0.26515648 0.25335939 0.24253563]
[0.26515648 0.25335939 0.24253563 0.23257321 0.22337616]]
Which overlaps with the computation in octave/matlab:
Rv =
0.93979 0.87790 0.80874 0.73994 0.67572
0.80874 0.73994 0.67572 0.61782 0.56653
0.67572 0.61782 0.56653 0.52145 0.48192
0.56653 0.52145 0.48192 0.44721 0.41665
0.48192 0.44721 0.41665 0.38964 0.36565
0.41665 0.38964 0.36565 0.34425 0.32508
0.36565 0.34425 0.32508 0.30782 0.29222
0.32508 0.30782 0.29222 0.27806 0.26516
0.29222 0.27806 0.26516 0.25336 0.24254
0.26516 0.25336 0.24254 0.23257 0.22338
This reduces the pyramid of doom and is probably faster than the for-loops due to numpy magic.
Edit: formatting
Edit2: gave check
I don't understand the code, works for storing the data, but the Rv result is not the same from matlab... The d.cumsum() goes just until the index it is supposed to?
– Jeniffer Barreto
Nov 15 '18 at 17:55
I had the parenthesis wrong. Edited the code snippet above to match your line. Essentially what how it works is similar to bsxfun in matlab. I am repeatedly doing an operation over the other dimensions. .cumsum() performs the cumutilative sum similar to what you are doing. The only difference is that my results are appended along the third axis. Which you don't use since you are overwriting z matrix.
– GlobalTraveler
Nov 15 '18 at 18:08
Also added confirmation with output of the last iteratons
– GlobalTraveler
Nov 15 '18 at 18:21
thank you very much! works great! this is much ahead of my knowledge in python
– Jeniffer Barreto
Nov 16 '18 at 14:24
No problem. Just be mindful that this is numpy magic and not necessarily python. Numpy arrays are very useful for numerical computations compared to normal lists.
– GlobalTraveler
Nov 16 '18 at 14:26
add a comment |
I would suggest taking use of the broadcasting feature
The loops can then be replaced to clarify the code :
from numpy import array, ones
S =array([0.5, 0.7, 0.9, 1.1])
d = 0.2*ones((10));
h = array([ 0, 0.1, 0.2, 0.3, 0.4])
z = ((d.cumsum()[:, None] + h).ravel() / S[:, None]).reshape((S.size, d.size, h.size))
Rv = 1 / (4 * z ** 2 + 1)** .5
# ...etc
print(Rv[-1])
Which outputs:
[[0.93979342 0.87789557 0.80873608 0.73994007 0.67572463]
[0.80873608 0.73994007 0.67572463 0.61782155 0.56652882]
[0.67572463 0.61782155 0.56652882 0.52145001 0.48191875]
[0.56652882 0.52145001 0.48191875 0.4472136 0.41665471]
[0.48191875 0.4472136 0.41665471 0.38963999 0.36565237]
[0.41665471 0.38963999 0.36565237 0.34425465 0.32507977]
[0.36565237 0.34425465 0.32507977 0.30782029 0.29221854]
[0.32507977 0.30782029 0.29221854 0.27805808 0.26515648]
[0.29221854 0.27805808 0.26515648 0.25335939 0.24253563]
[0.26515648 0.25335939 0.24253563 0.23257321 0.22337616]]
Which overlaps with the computation in octave/matlab:
Rv =
0.93979 0.87790 0.80874 0.73994 0.67572
0.80874 0.73994 0.67572 0.61782 0.56653
0.67572 0.61782 0.56653 0.52145 0.48192
0.56653 0.52145 0.48192 0.44721 0.41665
0.48192 0.44721 0.41665 0.38964 0.36565
0.41665 0.38964 0.36565 0.34425 0.32508
0.36565 0.34425 0.32508 0.30782 0.29222
0.32508 0.30782 0.29222 0.27806 0.26516
0.29222 0.27806 0.26516 0.25336 0.24254
0.26516 0.25336 0.24254 0.23257 0.22338
This reduces the pyramid of doom and is probably faster than the for-loops due to numpy magic.
Edit: formatting
Edit2: gave check
I don't understand the code, works for storing the data, but the Rv result is not the same from matlab... The d.cumsum() goes just until the index it is supposed to?
– Jeniffer Barreto
Nov 15 '18 at 17:55
I had the parenthesis wrong. Edited the code snippet above to match your line. Essentially what how it works is similar to bsxfun in matlab. I am repeatedly doing an operation over the other dimensions. .cumsum() performs the cumutilative sum similar to what you are doing. The only difference is that my results are appended along the third axis. Which you don't use since you are overwriting z matrix.
– GlobalTraveler
Nov 15 '18 at 18:08
Also added confirmation with output of the last iteratons
– GlobalTraveler
Nov 15 '18 at 18:21
thank you very much! works great! this is much ahead of my knowledge in python
– Jeniffer Barreto
Nov 16 '18 at 14:24
No problem. Just be mindful that this is numpy magic and not necessarily python. Numpy arrays are very useful for numerical computations compared to normal lists.
– GlobalTraveler
Nov 16 '18 at 14:26
add a comment |
I would suggest taking use of the broadcasting feature
The loops can then be replaced to clarify the code :
from numpy import array, ones
S =array([0.5, 0.7, 0.9, 1.1])
d = 0.2*ones((10));
h = array([ 0, 0.1, 0.2, 0.3, 0.4])
z = ((d.cumsum()[:, None] + h).ravel() / S[:, None]).reshape((S.size, d.size, h.size))
Rv = 1 / (4 * z ** 2 + 1)** .5
# ...etc
print(Rv[-1])
Which outputs:
[[0.93979342 0.87789557 0.80873608 0.73994007 0.67572463]
[0.80873608 0.73994007 0.67572463 0.61782155 0.56652882]
[0.67572463 0.61782155 0.56652882 0.52145001 0.48191875]
[0.56652882 0.52145001 0.48191875 0.4472136 0.41665471]
[0.48191875 0.4472136 0.41665471 0.38963999 0.36565237]
[0.41665471 0.38963999 0.36565237 0.34425465 0.32507977]
[0.36565237 0.34425465 0.32507977 0.30782029 0.29221854]
[0.32507977 0.30782029 0.29221854 0.27805808 0.26515648]
[0.29221854 0.27805808 0.26515648 0.25335939 0.24253563]
[0.26515648 0.25335939 0.24253563 0.23257321 0.22337616]]
Which overlaps with the computation in octave/matlab:
Rv =
0.93979 0.87790 0.80874 0.73994 0.67572
0.80874 0.73994 0.67572 0.61782 0.56653
0.67572 0.61782 0.56653 0.52145 0.48192
0.56653 0.52145 0.48192 0.44721 0.41665
0.48192 0.44721 0.41665 0.38964 0.36565
0.41665 0.38964 0.36565 0.34425 0.32508
0.36565 0.34425 0.32508 0.30782 0.29222
0.32508 0.30782 0.29222 0.27806 0.26516
0.29222 0.27806 0.26516 0.25336 0.24254
0.26516 0.25336 0.24254 0.23257 0.22338
This reduces the pyramid of doom and is probably faster than the for-loops due to numpy magic.
Edit: formatting
Edit2: gave check
I would suggest taking use of the broadcasting feature
The loops can then be replaced to clarify the code :
from numpy import array, ones
S =array([0.5, 0.7, 0.9, 1.1])
d = 0.2*ones((10));
h = array([ 0, 0.1, 0.2, 0.3, 0.4])
z = ((d.cumsum()[:, None] + h).ravel() / S[:, None]).reshape((S.size, d.size, h.size))
Rv = 1 / (4 * z ** 2 + 1)** .5
# ...etc
print(Rv[-1])
Which outputs:
[[0.93979342 0.87789557 0.80873608 0.73994007 0.67572463]
[0.80873608 0.73994007 0.67572463 0.61782155 0.56652882]
[0.67572463 0.61782155 0.56652882 0.52145001 0.48191875]
[0.56652882 0.52145001 0.48191875 0.4472136 0.41665471]
[0.48191875 0.4472136 0.41665471 0.38963999 0.36565237]
[0.41665471 0.38963999 0.36565237 0.34425465 0.32507977]
[0.36565237 0.34425465 0.32507977 0.30782029 0.29221854]
[0.32507977 0.30782029 0.29221854 0.27805808 0.26515648]
[0.29221854 0.27805808 0.26515648 0.25335939 0.24253563]
[0.26515648 0.25335939 0.24253563 0.23257321 0.22337616]]
Which overlaps with the computation in octave/matlab:
Rv =
0.93979 0.87790 0.80874 0.73994 0.67572
0.80874 0.73994 0.67572 0.61782 0.56653
0.67572 0.61782 0.56653 0.52145 0.48192
0.56653 0.52145 0.48192 0.44721 0.41665
0.48192 0.44721 0.41665 0.38964 0.36565
0.41665 0.38964 0.36565 0.34425 0.32508
0.36565 0.34425 0.32508 0.30782 0.29222
0.32508 0.30782 0.29222 0.27806 0.26516
0.29222 0.27806 0.26516 0.25336 0.24254
0.26516 0.25336 0.24254 0.23257 0.22338
This reduces the pyramid of doom and is probably faster than the for-loops due to numpy magic.
Edit: formatting
Edit2: gave check
edited Nov 15 '18 at 18:16
answered Nov 15 '18 at 15:57
GlobalTravelerGlobalTraveler
612310
612310
I don't understand the code, works for storing the data, but the Rv result is not the same from matlab... The d.cumsum() goes just until the index it is supposed to?
– Jeniffer Barreto
Nov 15 '18 at 17:55
I had the parenthesis wrong. Edited the code snippet above to match your line. Essentially what how it works is similar to bsxfun in matlab. I am repeatedly doing an operation over the other dimensions. .cumsum() performs the cumutilative sum similar to what you are doing. The only difference is that my results are appended along the third axis. Which you don't use since you are overwriting z matrix.
– GlobalTraveler
Nov 15 '18 at 18:08
Also added confirmation with output of the last iteratons
– GlobalTraveler
Nov 15 '18 at 18:21
thank you very much! works great! this is much ahead of my knowledge in python
– Jeniffer Barreto
Nov 16 '18 at 14:24
No problem. Just be mindful that this is numpy magic and not necessarily python. Numpy arrays are very useful for numerical computations compared to normal lists.
– GlobalTraveler
Nov 16 '18 at 14:26
add a comment |
I don't understand the code, works for storing the data, but the Rv result is not the same from matlab... The d.cumsum() goes just until the index it is supposed to?
– Jeniffer Barreto
Nov 15 '18 at 17:55
I had the parenthesis wrong. Edited the code snippet above to match your line. Essentially what how it works is similar to bsxfun in matlab. I am repeatedly doing an operation over the other dimensions. .cumsum() performs the cumutilative sum similar to what you are doing. The only difference is that my results are appended along the third axis. Which you don't use since you are overwriting z matrix.
– GlobalTraveler
Nov 15 '18 at 18:08
Also added confirmation with output of the last iteratons
– GlobalTraveler
Nov 15 '18 at 18:21
thank you very much! works great! this is much ahead of my knowledge in python
– Jeniffer Barreto
Nov 16 '18 at 14:24
No problem. Just be mindful that this is numpy magic and not necessarily python. Numpy arrays are very useful for numerical computations compared to normal lists.
– GlobalTraveler
Nov 16 '18 at 14:26
I don't understand the code, works for storing the data, but the Rv result is not the same from matlab... The d.cumsum() goes just until the index it is supposed to?
– Jeniffer Barreto
Nov 15 '18 at 17:55
I don't understand the code, works for storing the data, but the Rv result is not the same from matlab... The d.cumsum() goes just until the index it is supposed to?
– Jeniffer Barreto
Nov 15 '18 at 17:55
I had the parenthesis wrong. Edited the code snippet above to match your line. Essentially what how it works is similar to bsxfun in matlab. I am repeatedly doing an operation over the other dimensions. .cumsum() performs the cumutilative sum similar to what you are doing. The only difference is that my results are appended along the third axis. Which you don't use since you are overwriting z matrix.
– GlobalTraveler
Nov 15 '18 at 18:08
I had the parenthesis wrong. Edited the code snippet above to match your line. Essentially what how it works is similar to bsxfun in matlab. I am repeatedly doing an operation over the other dimensions. .cumsum() performs the cumutilative sum similar to what you are doing. The only difference is that my results are appended along the third axis. Which you don't use since you are overwriting z matrix.
– GlobalTraveler
Nov 15 '18 at 18:08
Also added confirmation with output of the last iteratons
– GlobalTraveler
Nov 15 '18 at 18:21
Also added confirmation with output of the last iteratons
– GlobalTraveler
Nov 15 '18 at 18:21
thank you very much! works great! this is much ahead of my knowledge in python
– Jeniffer Barreto
Nov 16 '18 at 14:24
thank you very much! works great! this is much ahead of my knowledge in python
– Jeniffer Barreto
Nov 16 '18 at 14:24
No problem. Just be mindful that this is numpy magic and not necessarily python. Numpy arrays are very useful for numerical computations compared to normal lists.
– GlobalTraveler
Nov 16 '18 at 14:26
No problem. Just be mindful that this is numpy magic and not necessarily python. Numpy arrays are very useful for numerical computations compared to normal lists.
– GlobalTraveler
Nov 16 '18 at 14:26
add a comment |
You need to define z
and Rv
to be 2D and 3D arrays of known size before you do this.
Note also that python (and numpy) arrays are zero-based, so just use range
directly.
Not tested:
import numpy as np
d = 0.2*np.arange(10) ### not sure if this is what you meant
h = np.array([ 0 0.1 0.2 0.3 0.4])
n_S = 4
n_alt = 9
n_cam = 6
Rv = np.zeros((n_S, n_alt, n_cam))
z = np.zeros((n_cam, n_alt))
for i in range(n_S):
for j in range(n_alt):
for k in range(n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i] ## not sure about 0:10
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
However, as @GlobalTraveler points out, the most pythonic/numpyish way to do this is to take advantage of broadcasting and not use a loop at all:
Rv = 1/np.sqrt(4 * z**2 + 1)
your code also works, thank you =)
– Jeniffer Barreto
Nov 16 '18 at 14:25
add a comment |
You need to define z
and Rv
to be 2D and 3D arrays of known size before you do this.
Note also that python (and numpy) arrays are zero-based, so just use range
directly.
Not tested:
import numpy as np
d = 0.2*np.arange(10) ### not sure if this is what you meant
h = np.array([ 0 0.1 0.2 0.3 0.4])
n_S = 4
n_alt = 9
n_cam = 6
Rv = np.zeros((n_S, n_alt, n_cam))
z = np.zeros((n_cam, n_alt))
for i in range(n_S):
for j in range(n_alt):
for k in range(n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i] ## not sure about 0:10
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
However, as @GlobalTraveler points out, the most pythonic/numpyish way to do this is to take advantage of broadcasting and not use a loop at all:
Rv = 1/np.sqrt(4 * z**2 + 1)
your code also works, thank you =)
– Jeniffer Barreto
Nov 16 '18 at 14:25
add a comment |
You need to define z
and Rv
to be 2D and 3D arrays of known size before you do this.
Note also that python (and numpy) arrays are zero-based, so just use range
directly.
Not tested:
import numpy as np
d = 0.2*np.arange(10) ### not sure if this is what you meant
h = np.array([ 0 0.1 0.2 0.3 0.4])
n_S = 4
n_alt = 9
n_cam = 6
Rv = np.zeros((n_S, n_alt, n_cam))
z = np.zeros((n_cam, n_alt))
for i in range(n_S):
for j in range(n_alt):
for k in range(n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i] ## not sure about 0:10
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
However, as @GlobalTraveler points out, the most pythonic/numpyish way to do this is to take advantage of broadcasting and not use a loop at all:
Rv = 1/np.sqrt(4 * z**2 + 1)
You need to define z
and Rv
to be 2D and 3D arrays of known size before you do this.
Note also that python (and numpy) arrays are zero-based, so just use range
directly.
Not tested:
import numpy as np
d = 0.2*np.arange(10) ### not sure if this is what you meant
h = np.array([ 0 0.1 0.2 0.3 0.4])
n_S = 4
n_alt = 9
n_cam = 6
Rv = np.zeros((n_S, n_alt, n_cam))
z = np.zeros((n_cam, n_alt))
for i in range(n_S):
for j in range(n_alt):
for k in range(n_cam):
z[k][j]= (sum(d[0:k])+h[j])/S[i] ## not sure about 0:10
Rv[i][j][k] = 1/((4*z[k,j]**2+1)**0.5)
However, as @GlobalTraveler points out, the most pythonic/numpyish way to do this is to take advantage of broadcasting and not use a loop at all:
Rv = 1/np.sqrt(4 * z**2 + 1)
edited Nov 15 '18 at 22:51
answered Nov 15 '18 at 15:43
Andrew JaffeAndrew Jaffe
18.6k23950
18.6k23950
your code also works, thank you =)
– Jeniffer Barreto
Nov 16 '18 at 14:25
add a comment |
your code also works, thank you =)
– Jeniffer Barreto
Nov 16 '18 at 14:25
your code also works, thank you =)
– Jeniffer Barreto
Nov 16 '18 at 14:25
your code also works, thank you =)
– Jeniffer Barreto
Nov 16 '18 at 14:25
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%2f53322573%2fstore-data-from-a-triple-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
There are several variables (or functions, not sure which) that you don't appear to define (at least in this code snippet):
z
andd
being among them. Also, what do you mean by "it's not working?" Are there specific error messages you see?– Jonah Bishop
Nov 15 '18 at 15:21
missing
z
d
h
S
definitions. Also as @JonahBishop said, what is 'not working'?– krflol
Nov 15 '18 at 15:24
I didn't put all code...d = 0.2*ones(1,10), h = [ 0 0.1 0.2 0.3 0.4] z is calculate from d and h
– Jeniffer Barreto
Nov 15 '18 at 15:31
Well put all the code so we can help you.
– antfuentes87
Nov 15 '18 at 15:35
@antfuentes87 done! =)
– Jeniffer Barreto
Nov 15 '18 at 15:42