Как мне создать 2D-массив в Python?

#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 и используйте индексацию, чтобы установить значение в позиции в измененном массиве.