У меня есть массив numpy, и я хочу добавить к нему строку и изменить один столбец. Это мой массив:
import numpy as np
small_array = np.array ([[[3., 2., 5.],
[3., 2., 2.]],
[[3., 2., 7.],
[3., 2., 5.]]])
Затем, во-первых, я хочу добавить фиксированное значение (например, 2.
) в последний столбец. Я сделал это следующим образом:
chg = 2.
small_array[:,:,-1] += chg
Следующее, что я хочу сделать, это добавить еще одну строку в каждый массив. Добавляемая строка должна иметь одинаковые первый и второй столбцы, но третий столбец должен отличаться. На этот раз chg x 2. следует вычесть из существующего значения в третьем столбце:
big_array = np.array ([[[3., 2., 7.],
[3., 2., 4.],
[3., 2., 0.]], # this row is added
[[3., 2., 9.],
[3., 2., 7.],
[3., 2., 3.]]]) # this row is added
Я очень ценю любую помощь, чтобы сделать это.
Вы пытались использовать numpy.resize?
https://numpy.org/doc/stable/reference/generated/numpy.resize.html
вам придется решить для себя, слишком ли это дорого в вычислительном отношении, и если numpy.list имеет больше смысла для ваших целей.
Например,
import numpy as np
a = np.array([[1,2], [3,4]])
a = np.resize(a, (3,2))
затем используйте индекс для редактирования значения массива в последней позиции
a[-1]=[8,9]
окончательный вывод этого примера должен быть
a
array([[1,2],
[3,4]
[8,9]])
Я добавил пример, который, надеюсь, иллюстрирует идею. Это то, что я могу взять вас на данный момент
Когда я тестировал изменение размера, исходное положение значений было изменено, поэтому я не уверен, что это сработает.
ну просто неправильно. у вас должно быть что-то еще, влияющее на ваш код. попробуйте только на моем примере. Я только что проверил свой скретч-код с помощью repl и опубликовал результат, чтобы вы могли увидеть, получили ли вы то же самое, а затем изолировать, что вызывает изменение вашей позиции. Также я изменил ответ, чтобы использовать отрицательную индексацию, поэтому вам не нужно беспокоиться о позиции.
Ну, ваш массив имеет форму (2,2), а OP - форму (2,2,3). Ваше изменение размера вставляет одну строку в конец, но необходимое изменение размера должно вставлять одну строку в конец каждой матрицы. Пожалуйста, проверьте свой код на вводе OP или, по крайней мере, на массиве той же формы.
Попробуйте test_array = np.array(range(12)).reshape((2,2,3))
(выдает array([[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]])
), а затем np.resize(test_array, (2,3,3))
, вы получите этот странный вывод: array([[[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[9, 10, 11], [0, 1, 2], [3, 4, 5]]])
, что определенно не то, что ищет ОП.
Я считаю, что операция, которую вы ищете, это np.concatenate
, которая может создать новый массив путем объединения двух массивов.
Простой пример, мы можем добавить ряд нулей следующим образом:
>>> np.concatenate((small_array, np.zeros((2,1,3))), axis=1)
array([[[3., 2., 7.],
[3., 2., 4.],
[0., 0., 0.]],
[[3., 2., 9.],
[3., 2., 7.],
[0., 0., 0.]]])
Теперь вместо нулей мы можем получить значения из первой строки в каждой матрице:
>>> np.concatenate((small_array, small_array[:,:1,:]), axis=1)
array([[[3., 2., 7.],
[3., 2., 4.],
[3., 2., 7.]],
[[3., 2., 9.],
[3., 2., 7.],
[3., 2., 9.]]])
На этом этапе вы можете изменить значение в третьем столбце новых строк по мере необходимости.
Здесь важен параметр axis
, он сообщает concatenate()
, по какой оси я хочу соединить два входных массива.
Документация: https://numpy.org/doc/stable/reference/generated/numpy.concatenate.html
Дорогая @apinostomberry, я пробовала
np.resize(small_array,(2,3,3))
но не дала мне того, что я хочу.