#python #arrays #python-3.x #numpy #keras
#python #массивы #python-3.x #numpy #keras
Вопрос:
Я работаю с keras, и всегда есть from со списками, поэтому я предполагаю, что всегда все должно быть преобразовано в массив numpy, что для меня очень нелогично. Я предполагаю, что это связано с производительностью? Я не вижу другой причины? Однако моя проблема выглядит так, как показано ниже. Я должен преобразовать эту часть кода:
output_sentence = []
final_output_sentence = []
for key in row['o'].lower():
temp_list = []
if key in dictionary.keys():
temp_list.append(dictionary[key])
output_sentence.append(temp_list)
else:
dictionary[key] = len(dictionary)
temp_list.append(dictionary[key])
output_sentence.append(temp_list)
final_output_sentence.append(output_sentence)
в код, основанный на массивах numpy. Я пытаюсь таким образом:
output_sentence = np.array([], dtype=int)
final_output_sentence = np.array([], dtype=int)
for key in row['o'].lower():
temp_list = np.array([], dtype=int)
if key in dictionary.keys():
temp_list = np.append(temp_list, dictionary[key])
output_sentence = np.append(output_sentence, temp_list)
else:
dictionary[key] = len(dictionary)
temp_list = np.append(temp_list, dictionary[key])
output_sentence = np.append(output_sentence, temp_list)
final_output_sentence = np.append(final_output_sentence, output_sentence)
однако вместо этого [[[1], [2], [3], [2], [4]]]
я получаю это [1 2 3 2 4]
. Есть идеи, как это решить?
Обновить
Что вы думаете о решении, показанном ниже? Есть какие-нибудь советы по оптимизации производительности?
output_sentence = []
for key in row['o'].lower():
temp_list = []
if key in dictionary.keys():
temp_list.append(dictionary[key])
output_sentence.append(temp_list)
else:
dictionary[key] = len(dictionary)
temp_list.append(dictionary[key])
output_sentence.append(temp_list)
final_output_sentence = np.array(output_sentence)
final_output_sentence = final_output_sentence.reshape(1, final_output_sentence.shape[0], 1)
Комментарии:
1. Обычно лучше использовать списки и list
append
и создавать массив с одним вызовом в конце.np.append
(и другие версииnp.concatenate
) работают медленнее, и их сложнее правильно применять.2. С помощью примера
row
иdictionary
и результатов из версии списка мы могли бы предложить улучшения. Иногда существуют способы замены операций со списком операциями с целым массивом. Но репликация добавлений к списку не относится к их числу. Почему вы добавляете к 2 спискам, когда у вас есть только один цикл итерации (вклkey
)?3. @hpaulj Вы имеете в виду эти две строки
temp_list.append(dictionary[key]) output_sentence.append(temp_list)
?
Ответ №1:
output_sentence = []
for key in row['o'].lower():
if key not in dictionary.keys():
dictionary[key] = len(dictionary)
output_sentence.append(dictionary[key])
final_output_sentence = np.array(output_sentence).reshape(1,-1,1)
- Если
key
не существует в словаре, добавьте его со следующим размером - Добавьте значение, соответствующее ключу, в
output_sentence
- Наконец,
output_sentence
это список, но поскольку вам нужен трехмерный массив, преобразуйте его в массив numpy и измените его форму. - x.изменить форму (1,-1,1) => изменить форму x таким образом, чтобы размер 0-й оси был равен 1, размер 2-й оси равен 1, а размер 1-й оси был таким же, как у элементов в x.
Комментарии:
1. @NinoFiliu Done обязательно сделает это с этого момента.