#python
#python
Вопрос:
Проблема: я пытаюсь создать 2D-массив (например, последнюю строку в коде), используя цикл for, подобный последней строке в следующем коде matlab:
for i=1:NumLines
J=i-1; J=0,1,2,...
if (mod(J,2)==0)
%Even
gj=gj_even;
else
%Odd
gj=gj_odd;
end
Erot(i)=((B0*J*(J 1))-D0*J^2*(J 1)^2)*planck*c; %correct
dnu_Stokes(i)=-B0*2*(2*J 3) D0*(3*(2*J 3) (2*J 3)^3); %2005
Xj_Stokes(i)=(J 1)*(J 2)/(2*J 3); %correct
dRCS_Stokes(i,:)=(112*pi^4/15).*(gj*planck*c*B0*(nu0 dnu_Stokes(i))^4*gammaSquared)./(((2*I 1).^2)*kb*T).*Xj_Stokes(i).*exp(-Erot(i)./(kb*T));
Вот моя проблема.В отличие от matlab, Python не создает для вас новый массив, поэтому вам придется создать пустой массив, прежде чем вы сможете поместить в них значение. Я продолжаю получать ошибку «только массивы длиной 1 могут быть преобразованы в скаляры Python».Вот моя попытка Python:
dnu_Stokes=np.array([])#empty arrays
Erot= np.array([])
Xj_Stokes=np.array([])
dRcs_Stokes=np.array([])
anti_dnu_Stokes=np.array([])
anti_Xj_Stokes=np.array([])
anti_dRcs_Stokes=np.array([]) #empty arrays
for i in range(1,NumLines):
J= i-1
if (J%2==0):
gj=gj_even
else:
gj=gj_odd
i_Erot = (B0*J*(J 1))-((D0*(J**2))*((J 1)**2)*planck*c)
Erot= np.append(Erot,i_Erot) # append vaues to EROT array (WORKS)
i_dnu_Stokes=-B0*2*(2*J 3) D0*(3*(2*J 3) (2*J 3)**3)
dnu_Stokes= np.append(dnu_Stokes,i_dnu_Stokes)# append vaues to dnu_skotes array (wORKS)
i_Xj_Stokes=(J 1)*(J 2)/(2*J 3)
Xj_Stokes= np.append(Xj_Stokes,i_Xj_Stokes) # append vaues to XJ array (WORKS)
dRcs_Stokes[i-1,:]=((112*((math.pi)**4))/15)*(((gj)*planck*c*B0*((nu0 i_dnu_Stokes)**4)*gammaSquared)/(((2*I 1)**2)*kb*T))*(i_Xj_Stokes*(math.exp(((-i_Erot)/(kb*T))))) ###I dont know how to append values to create a 2D array###
Комментарии:
1. Предварительно распределите с помощью
numpy.zeros
. Добавление к массивам numpy — это плохо. Увеличение размера массива в MATLAB также является плохой, плохой идеей, потому что это замедляет работу вашей программы на порядки, если выполняется значительное количество операций по изменению размера. MATLAB также имеетzeros
Ответ №1:
Вот простой пример «привет, мир» того, что вы пытаетесь сделать:
arr = []
for row_num in range(5): # add 5 rows. row_num is 0...4
row = []
for col_num in range(6): # add 6 columns. col_num is 0...5
print("computing element for row:", row_num, ", col:", col_num)
element = (row_num * col_num) # this is where you compute each element
row.append(element)
arr.append(row)
arr = np.array(arr)
Вы должны быть в состоянии взять его отсюда
Комментарии:
1. Что делает «arr = np.array (arr)»?
2. @Mikal он создает массив numpy из заданного массива (
arr
)3.
append
Функция может быть очень медленным способом построения большого массива, когда необходимо перераспределять память и копировать данные по мере роста массива. Я бы посоветовал предварительное распределение, если количество элементов известно заранее.
Ответ №2:
Знаете ли вы (или можете ли вы вычислить) размеры вашего массива или количество записей?
Вы можете взять 1D массив некоторой длины и использовать reshape
для изменения его размеров.
Например, учтите, что вы заранее знаете, что будете хранить 100 значений. Вы можете предварительно выделить массив нулей, например:
a = np.zeros(100)
А затем изменить его любым количеством способов:
b = a.reshape(10, 10) # 10x10 2D array
c = a.reshape(2, 5, 10) # 2x5x10 3D array
и т.д.
Индексирование происходит так, как вы и ожидали:
print(b[0]) # array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
print(b[0][2]) # 0.0
print(c[1][3][8]) # 0.0
Вы можете использовать индексацию для установки значения:
b[0][2] = 1.234
print(b[0]) # array([0. , 0. , 1.234, 0. , 0. , 0. , 0. , 0. , 0. , 0. ])
Использование append
сильно замедлит работу вашей программы, если вы работаете с большим массивом.
Предварительное распределение сэкономит время и память, а также поможет вам выявить ошибки индексирования.
Надеюсь, это поможет переосмыслить вашу проблему.
Комментарии:
1. Итак, в конце 30 итераций предполагается, что «dRcs_Stokes» представляет собой массив размером 30×3000. Другими словами, я добавляю 3000 значений данных на каждой итерации в новой строке. Вот где я запутался.
2. Предварительно выделите массив из 90000 элементов, измените его размер на 30×3000 и используйте индексацию, чтобы установить значение в позиции в измененном массиве.