Изменение массива, возвращающего неверный вывод

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Я новичок в numpy и пытаюсь выполнить некоторую нарезку и индексацию с помощью массивов. Моя цель — взять массив и использовать нарезку и индексирование, чтобы возвести в квадрат последний столбец, а затем вычесть первый столбец из этого результата. Затем я хочу поместить новый столбец обратно в старый массив.

Я смог выяснить, как нарезать и проиндексировать столбец, чтобы получить результат, который я хочу для последнего столбца. Однако моя проблема заключается в том, что когда я пытаюсь поместить его обратно в мой исходный массив, я получаю неверный вывод (как показано ниже).

 theNumbers = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])


sliceColumnOne = theNumbers[:,0]
sliceColumnThree = theNumbers[:,3]**2

editColumnThree = sliceColumnThree - sliceColumnOne

newArray = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[editColumnThree]])
print("nums:n{}".format(newArray))
  

Я хочу, чтобы вывод был

  [[  1   2   3  15]
 [  5   6   7  59]
 [  9  10  11 135]
 [ 13  14  15 243]]
  

Однако мой становится:

 [list([1, 2, 3, 4]) list([5, 6, 7, 8]) list([9, 10, 11, 12])
 list([array([ 15,  59, 135, 243])])]
  

Есть предложения о том, как это исправить?

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

1. Удалите квадратные скобки со всего editColumnThree в строке, которая создает newArray .

Ответ №1:

Просто назначьте последнюю строку массива numpy новой «theNumbers[3] = editColumnThree»

Код:

 import numpy as np
theNumbers = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])

sliceColumnOne = theNumbers[:,0]
sliceColumnThree = theNumbers[:,3]**2
editColumnThree = sliceColumnThree - sliceColumnOne

theNumbers[3] = editColumnThree
print("nums:n{}".format(theNumbers))
  

Вывод:

 [[  1   2   3   4]
 [  5   6   7   8]
 [  9  10  11  12]
 [ 15  59 135 243]]
  

Ответ №2:

 newArray = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[editColumnThree]])
print("nums:n{}".format(newArray))
  

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

 newArray = theNumbers.copy() # if a copy is needed
newArray[:,-1] = editColumnThree # replace last (-1) column
  

Ответ №3:

Если вы просто хотите сложить векторы поверх друг друга, используйте vstack :

 import numpy as np

theNumbers = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
newNumbers = np.vstack(theNumbers)
print(newNumbers)

>>>[[ 1  2  3  4]
   [ 5  6  7  8]
   [ 9 10 11 12]
   [13 14 15 16]]
  

Но проблема здесь не только в том, что вам нужно сложить эти числа, вы смешиваете столбцы и строки. Вы меняете строку вместо столбца. Чтобы изменить столбец, обновите последний элемент в каждой строке:

 import numpy as np

theNumbers = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])

LastColumn = theNumbers[:,3]**2
FirstColumn = theNumbers[:,0]
editColumnThree = LastColumn - FirstColumn

for i in range(4):
  theNumbers[i,3] = editColumnThree [i]

print(theNumbers)

>>>[[  1   2   3  15]
 [  5   6   7  59]
 [  9  10  11 135]
 [ 13  14  15 243]]