@Johnem

Как применить функцию к массиву numpy?

Есть массив 10000 на 5, в каждой строке первые четыре элемента - коэффициенты для функции, а пятый - 0. Можно ли, и если да, то как, что бы в каждой строке пятый элемент был заполнен результатом использования соответствующих ему элементов (первые четыре, в этой же строке) для функции без использования for (с ним я сделал, пример ниже). Ниже примеры моих попыток и вспомогательный код.
Создание массива (Массив содержит нулевые 5 элементы):
import numpy as np

list = []
for a in range(0, 10):
    for b in range(0, 10):
        for c in range(0, 10):
            for d in range(0, 10):
                list.append([a, b, c, d])
array = np.zeros((10000, 5))
for i in range(0, 10000):
    for a in range(0, 4):
        array[i, a] = list[i][a] * 0.001

Пример функции (значение ad будет 5 элементом):
def task(coef):
    ad = float(coef[0] + coef[1] * coef[2] - coef[3])
    if coef[0] != 0:
        ad = ad/coef[0]
    else:
        ad = ad/100
    return ad

То, как я это реализовал:
for i in range(0, 10000):
            array[i, 4] = task(array[i, 0:4])
  • Вопрос задан
  • 730 просмотров
Решения вопроса 2
@PavelMos
через list comprehension
на входе array - список из списков по 4 элемента. В task() передаётся элемент-список из 4 элементов, по элементам которого она считает это значение и записывает его пятым значением в новый элементы, который добавляет в новый массив
array_out=[ [i[0],i[1],i[2],i[3],task(i)] for i in array]
Ответ написан
Комментировать
ScriptKiddo
@ScriptKiddo
Не особо шарю в numpy, но вот что нагуглил
import numpy as np


def permgrid(m, n):
    inds = np.indices((m,) * n, dtype='float')
    return inds.reshape(n, -1).T


# Создаем матрицу перестановок
a = permgrid(10, 4)

# Перемножаем матрицу
a *= 0.001

def task(coef):
    ad = float(coef[0] + coef[1] * coef[2] - coef[3])
    if coef[0] != 0:
        ad = ad / coef[0]
    else:
        ad = ad / 100
    return ad


# Применяем функцию, итерируясь по строкам матрицы
task_result = np.apply_along_axis(task, 1, a)
# Вектор преобразуем из строки в столбец
task_result = np.reshape(task_result, (-1, 1))

# Присоединяем столбец к исходной матрице
a = np.concatenate((a, task_result), axis=1)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы