У меня есть Dataframe, который соответствует трехмерной центральной линии (x, y, z). Я хочу превратить Dataframe в двоичный массив с формой (272, 512, 512). Значения z в кадре данных варьируются от 40 до 160, и они соответствуют первому столбцу в массиве. Значения x и y соответствуют второму и третьему столбцам в массиве соответственно. Любое значение xyz, отсутствующее в кадре данных, должно соответствовать 0 в массиве, а любое имеющееся значение должно соответствовать 1. Любые идеи о том, как сделать это, учитывая, что каждая плоскость / срез может иметь несколько единиц в массиве?
Я смог бы выполнить это sh, если бы я ограничил Dataframe только одной строкой на уникальное значение z (одна точка для каждого среза), но реальные данные имеют несколько строк на уникальное значение z.
Вот как выглядит заголовок Dataframe
Этот код работает для пониженной дискретизации Dataframe (только одна строка на уникальное значение z):
def dataframe_to_binary_array(df):
'''
THIS FUNCTION TAKES IN A DOWNSAMPLED DATAFRAME AND CONVERTS IT TO A 3D
BINARY ARRAY THAT IS THE SAME SHAPE AS THE ORIGINAL DICOM STACK
'''
empty_array = np.zeros([272, 512, 512], dtype='int64')
z_column = df['Z']
for z in z_column:
z_df = df[z_column == z]
for k in range(0, 272):
x = z_df['X']
y = z_df['Y']
empty_array[z, x, y] = 1
return empty_array
Вот моя попытка кода для истинного кадра данных:
def dataframe_to_binary_array_new(df):
'''
THIS FUNCTION TAKES IN A DOWNSAMPLED DATAFRAME AND CONVERTS IT TO A 3D
BINARY ARRAY THAT IS THE SAME SHAPE AS THE ORIGINAL DICOM STACK
'''
empty_array = np.zeros([272, 512, 512], dtype='int64')
z_column = df['Z']
for i in range(0,272):
z_df = df[z_column == i]
for row in z_df:
x_col = z_df['X'].to_numpy()
y_col = z_df['Y'].to_numpy()
for x_element in x_col:
x = int(x_element)
for y_element in y_col:
y = int(y_element)
empty_array[i,x,y] = 1
return empty_array
Я получаю сообщение об ошибке: «IndexError: только целые числа, срезы (:
), многоточие (...
), numpy .newaxis (None
) и целые или логические массивы являются допустимыми индексами "