0

I'm trying to create and an array of shape (1, inter) [i.e. 1 row, inter Columns], where inter is user input;

If you look at the code below,

l_o_s, Inter, n_o_s, L, d_o_s are all from user inputs

The n_o_s represents the number of sections across the total length of the shaft that have lengths corresponding to the values in l_o_s and diameters corresponding to the values in d_o_s.

So

Section 1 has a length of 1.5 and diameter 3.75

Section 2 = length of 4.5-1.5 = 3 and diameter 3.5

Section 3 = length of 7.5-4.5 = 3 and diameter 3.75

and so forth...

Here's an image of the shaft arrangement: This is a shaft of length = 36, with 13 sections that have different size diameters

Inter is the number of intervals I require in the analysis, in this case inter is 3600, so I require a (1,3600) array.

si is an array that is a function (mathematical) of the length of the individual section in l_o_s, the total length (L) of the system and the interval (Inter).

Here's the question

So if you take every value in si = [ 150. 450. 750. 1050. 1350. 1650. 1950. 2250. 2550. 2850. 3150. 3450. 3600.]

I require an array of shape (1,3600) whose first 150 elements are all equal to the diameter of section 1 - (3.75), and the elements between 150 and 450 i need them to equal the diameter of the second section (3.5) and so forth...

So i need the first 150 element corresponding to index 0 in d_o_s and the next 300 elements corresponding to index 1 in d_o_s, etc...

Here's a code I began with, but I don't think it's worth talking about. I was creating an array of zeros with inner inner shapes corresponding to each of the 150,300,300,300 elements.

import numpy as np
import math 

L = 36
Inter = 3600
n_o_s = 13
l_o_s = np.asarray([1.5,4.5,7.5,10.5,13.5,16.5,19.5,22.5,25.5,28.5,31.5,34.5,36])
d_o_s = np.asarray([3.75,3.5,3.75,3.5,3.75,3.5,3.75,3.5,3.75,3.5,3.75,3.5,3.75])
si = np.asarray((l_o_s/L)*Inter)
print(si)





z = (si.size) 
def f(x):
for i in si:
    zz = np.zeros((x,1,int(i)))
    for j in range(int(z)):
        for p in range(int(d_o_s[j])):
            zz[j][0][p] = np.full((1,int(i)),(math.pi*d_o_s**4)/64)
return zz


print(f(z))

Any ideas, Dallan

This is what I ended up with but I'm only receiving 3599 values instead of the required 3600 any ideas? I used the diameter to output another variable (basically swapped the diameters in d_o_s for values in i_o_s)

L = 36
Inter = 3600
n_o_s = 13
l_o_s = np.asarray([0,1.5,4.5,7.5,10.5,13.5,16.5,19.5,22.5,25.5,28.5,31.5,34.5,36])
d_o_s = np.asarray([3.75,3.5,3.75,3.5,3.75,3.5,3.75,3.5,3.75,3.5,3.75,3.5,3.75])
i_o_s = (math.pi*d_o_s**4)/64
si = np.asarray((l_o_s/L)*Inter)

lengths = si[1:] - si[:-1]

Iu = np.asarray(sum([[value]*(int(length)) for value, length in zip(i_o_s, lengths)], []))
print(Iu,Iu.shape)

1 Answer 1

1

In python, an operation like 4 *[1] produces [1,1,1,1]. So, you need to calculate the lengths of the subarrays, create them, and concatenate them using sum().

lengths = si[1:] - si[:-1]

result = sum([
    [value]*length for value, length in zip(d_o_s, lengths)
], [])

Also, your si array is of type float, so you get a rounding error when used as index. convert it to integer, by changing

si = np.asarray((l_o_s/L)*Inter)

to

si = np.asarray((l_o_s/L)*Inter).astype(int)
Sign up to request clarification or add additional context in comments.

2 Comments

It worked with some edits, thanks either way. Do you know how I get it to output the 3600 values instead of 3599 - Check the question again to see what I mean
Thanks blue note!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.