Numpy: как применить функцию к каждой строке массива - PullRequest
0 голосов
/ 07 мая 2018

У меня есть двумерный массив с именем my_data. Каждая строка представляет информацию об одной точке данных, а каждый столбец представляет различные атрибуты этой точки данных.

У меня есть функция с именем processRow. Он занимает строку, выполняет некоторую обработку информации и возвращает измененную строку. Длина строки, возвращаемой функцией, больше, чем строка, принятая функцией (функция в основном расширяет некоторые категориальные данные в однозначные векторы)

Как мне получить массив numpy, в котором каждая строка была обработана этой функцией?

Я пытался

answer = np.array([])
for row in my_data:
    answer = np.append(answer,processRow(row))

но, в конце, ответ - просто одна действительно длинная строка, а не двумерная сетка

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

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

def funky(x):
    temp = []
    for value in x:
        value += 1
        temp.append(value)
    temp.append(temp[0] + temp[1])
    return np.array(temp)

my_data = np.array([[1,1], [2,2]]) 

answer = np.apply_along_axis(funky, 1, my_data)
print("This is the original data:\n{}".format(my_data))
print("This is the adjusted data:\n{}".format(answer))

Ниже приведены до и после модификации массива:

This is the original data:
[[1 1]
 [2 2]]
This is the adjusted data:
[[2 2 4]
 [3 3 6]]
0 голосов
/ 07 мая 2018

Вы можете использовать vstack, поскольку строка имеет другую форму ответа. Вам также необходимо указать форму ответа:

In [11]: my_data = np.array([[1, 2], [3, 4]])
    ...: process_row = lambda x: x  # do nothing

In [12]: answer = np.empty((0, 2), dtype='int64')
    ...: for row in my_data:
    ...:     answer = np.vstack([answer, process_row(row)])
    ...:

In [13]: answer
Out[13]:
array([[ 1,  2],
       [ 3,  4]])

Тем не менее, вам, вероятно, лучше сделать понимание списка, а затем передать его numpy после:

In [21]: np.array([process_row(row) for row in my_data])
Out[21]:
array([[1, 2],
       [3, 4]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...