Как преобразовать этот код, основанный на списках, в код, основанный на массивах numpy?

#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 обязательно сделает это с этого момента.