numpy:如何将函数应用于数组的每一行

时间:2018-05-06 21:31:06

标签: python arrays numpy

我有一个名为my_data的2d numpy数组。每行代表有关一个数据点的信息,每列代表该数据点的不同属性。

我有一个名为processRow的函数。它接受一行,并对信息进行一些处理并返回修改后的行。函数返回的行的长度比函数所占的行长(该函数基本上将一些分类数据扩展为一个热矢量)

如何使用此函数处理每一行的numpy数组?

我试过

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

但最后,答案只是一个非常长的行,而不是一个2d网格

2 个答案:

答案 0 :(得分:1)

您可以使用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]])

答案 1 :(得分:0)

我不确定在没有看到数据样本的情况下我是否完全得到了你所拥有的东西。但希望这可以帮助您达到您想要的结果。我简化了概念,只是将一个值添加到传递给函数的行中的每个值,并将结果一起添加到总计中(只是为了扩展返回数组的大小)。当然,您可以根据需要调整处理。

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]]