np.добавить только последнее добавленное значение?

#python #numpy #append

#питон #numpy #добавить #python

Вопрос:

В приведенном ниже коде я пытался использовать np.append , но он дает мне только последнее значение, добавленное в цикле.

У меня есть два вложенных цикла for (один выполняется с индексом i , другой с k ). Теперь я хочу использовать определенную функцию для разных индексов, и я хочу, чтобы результаты были сведены в один массив. Таким образом, чтобы каждая строка в массиве содержала результат для одного индекса.

Вот минимальный воспроизводимый пример:

 import numpy as np

a = np.arange(0,2,1)
b = np.arange(3,5,1)
c = np.array([])

for i in range(0,2,1):
    for k in range(0,2,1):
        c = np.append(a[i],b[k])
print(c)
  

Результат таков [1 4] . Но я хочу, чтобы один единственный вектор c содержал ([0 3][0 4][1 3][1 4])

Комментарии:

1. Является ли использование numpy/append обязательным?

Ответ №1:

Вы создаете 1d массив вместо 2d. и np.append вам нужно передать текущий массив и добавляющие элементы, и он вернет новый массив.

 a = np.arange(0,2,1)
b = np.arange(3,5,1)
c = np.empty(shape=[0, 2])

for i in range(0,2,1):
    for k in range(0,2,1):
        c = np.append(c,[[a[i],b[k]]],axis=0)
        
print(c)
  

Вывод:

 [[0. 3.]
 [0. 4.]
 [1. 3.]
 [1. 4.]]
  

Комментарии:

1. @Felix Примечание: . np.append работает медленнее по сравнению с python append , поскольку numpy каждый раз создает новый массив.

Ответ №2:

Вас смущает синтаксис для np.append()

Используйте ниже для правильной реализации:

 c = np.append(c,[a[i],b[k]])
  

Также для этого вы получите вывод, напечатанный как:

 [0. 3. 0. 4. 1. 3. 1. 4.]
  

Я запутался в векторе, о котором вы говорите : ([0 3][0 4][1 3][1 4])

Указанное вами представление не является вектором, а выглядит как матрица с размерностью 4x2 , где .reshape() может вам помочь.

Если вы этого хотите, просто напишите: c.reshape((4,2)) что даст вам:

 [[0. 3.]
 [0. 4.]
 [1. 3.]
 [1. 4.]]
  

Комментарии:

1. Спасибо за ваш ответ. Да, это было просто неправильно… Я говорил о векторе, но вместо этого хотел создать матрицу.

2. @Felix Нет проблем, вы можете попробовать reshape() !

3. Итак, теперь возникла проблема с аргументом reshape, может быть, у вас есть решение для этого. Теперь я создал массив (на этот раз это действительно массив, одномерный со 100 записями) с помощью этого вложенного for-цикла. И теперь я попытался преобразовать этот (100,) вектор в (10,10) матрицу. Я пробовал это с reshape помощью and np.reshape , но он продолжает говорить мне: невозможно преобразовать массив размером 1 в форму (10,10). Я понятия не имею, почему этот массив должен иметь размер 1. В массиве ровно 100 записей…

4. Редактировать: я решил это… Конечно, мне нужно выполнить reshape внешнюю часть цикла for, иначе Python попытается изменить массив в каждом цикле.