Перебор массива и изменение строки на основе элементов

#python #numpy

Вопрос:

Если у нас есть 2D массив. Предположим, я хотел бы поместить в квадрат первый элемент строки и сохранить его, а затем взять куб второго элемента и снова сохранить его в исходном массиве. Один из способов-выполнить итерацию по массиву:

 #arr shape is (2,2)
arr = np.array([[1, 2], [4, 5]], np.int32)
squarred = np.zeros((arr.shape[0], 2))    
squarred [:,0] = arr[:,0]*arr[:,0]
squarred [:,1] = arr[:,1] * arr[:,1] * arr[:,1]
 

Вопрос: Можем ли мы сделать то же самое, используя итерацию цикла, пожалуйста? Это образец для 2D-массива. Что делать, если у нас есть произвольный массив любого размера, и мы хотели бы изменить каждый элемент в каждой строке на пользовательское значение, каков был бы ваш наиболее эффективный подход, пожалуйста?

Редактировать:

  • 2D массив размером (2,2) и такой же для вывода. Но выходной элемент имеет первый элемент каждой строки в квадрате, а второй в кубе. В общем, каков был бы наиболее эффективный способ сделать это, учитывая, что у нас есть еще большие массивы, пожалуйста?
  • Не могли бы вы, пожалуйста, опубликовать свой ответ для поэлементного изменения каждого значения в каждой строке на произвольное значение, пожалуйста?

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

1. Пожалуйста, добавьте ввод и ожидаемый результат

2. arr ** [2,3] . Но это без петли.

3. @MichaelSzczesny. Спасибо. Какой был бы наиболее эффективный способ, основанный на том, что вы знаете, пожалуйста? Что делать, если у нас более 2 элементов в строке, где мы хотим внести пользовательские изменения в каждый элемент, каков был бы ваш подход, пожалуйста?

4. @Avra — Вещание должно быть самым быстрым методом, независимо от размера вашего массива. Итерация в цикле должна быть самой медленной на сегодняшний день. Если у вас есть другой вопрос, пожалуйста, задайте его в другом вопросе о stackoverflow.

5. @Avra — Извините, я не могу опубликовать ответ на вопрос, отличный от вашего примера. И вы специально просите о решении цикла. Я не буду публиковать ответ с циклом на этот вопрос.

Ответ №1:

Используйте numpy.power функцию:

 # 1xN could also be [3, 5], [2, 8], or any array of size N
exponents_per_row = np.arange(2, 4)
exponents = np.tile(exponents_per_row, (2, 1))
res = np.power(arr, exponents)
print(res)
 

Выход

 [[  1   8]
 [ 16 125]]
 

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

1. Спасибо. Для произвольного изменения каждого элемента в строке на пользовательскую мощность, пожалуйста, измените код соответствующим образом.

2. @Avra Я не понимаю вопроса, просто измените массив показателей так, как вы считаете нужным

3. Я имею в виду, что если у нас есть N элементы в каждой строке NxM массива, поэтому мы хотели бы изменить размер каждого элемента в строке 1xN на произвольное значение и одинаковый для всех остальных строк, каков был бы ваш подход здесь, пожалуйста?

4. @Avra обновил ответ!

5. Спасибо! Таким образом, показатели будут применены к каждой строке, что делать, если изменения, внесенные в каждую строку, будут отличаться от показателей других строк, пожалуйста? Я имею в виду, что каждая строка будет иметь свои собственные показатели. Должны ли мы в этом случае использовать петлю, пожалуйста? Если да, то делается ли это так for x in Arr: exponents_per_row = np.arange(2, 4) exponents = np.tile(exponents_per_row, (2, 1)) res = np.power(arr, exponents) print(res)