Как добавить строки в массив numpy

У меня есть массив 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

Я очень ценю любую помощь, чтобы сделать это.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пытались использовать 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]])

Дорогая @apinostomberry, я пробовала np.resize(small_array,(2,3,3)) но не дала мне того, что я хочу.

Ali_d 16.03.2022 14:13

Я добавил пример, который, надеюсь, иллюстрирует идею. Это то, что я могу взять вас на данный момент

apinostomberry 16.03.2022 14:18

Когда я тестировал изменение размера, исходное положение значений было изменено, поэтому я не уверен, что это сработает.

joanis 16.03.2022 14:22

ну просто неправильно. у вас должно быть что-то еще, влияющее на ваш код. попробуйте только на моем примере. Я только что проверил свой скретч-код с помощью repl и опубликовал результат, чтобы вы могли увидеть, получили ли вы то же самое, а затем изолировать, что вызывает изменение вашей позиции. Также я изменил ответ, чтобы использовать отрицательную индексацию, поэтому вам не нужно беспокоиться о позиции.

apinostomberry 16.03.2022 15:34

Ну, ваш массив имеет форму (2,2), а OP - форму (2,2,3). Ваше изменение размера вставляет одну строку в конец, но необходимое изменение размера должно вставлять одну строку в конец каждой матрицы. Пожалуйста, проверьте свой код на вводе OP или, по крайней мере, на массиве той же формы.

joanis 16.03.2022 18:41

Попробуйте 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]]]), что определенно не то, что ищет ОП.

joanis 16.03.2022 18:48
Ответ принят как подходящий

Я считаю, что операция, которую вы ищете, это 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

Другие вопросы по теме