Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy:如何将函数应用于数组的每一行_Python_Arrays_Numpy - Fatal编程技术网

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

Python numpy:如何将函数应用于数组的每一行,python,arrays,numpy,Python,Arrays,Numpy,我有一个名为my\u data的2d numpy数组。每行表示关于一个数据点的信息,每列表示该数据点的不同属性 我有一个名为processRow的函数。它接收一行,并对信息进行一些处理,然后返回修改后的行。函数返回的行的长度比函数接收的行长(函数基本上将一些分类数据扩展为一个热向量) 我怎样才能拥有一个numpy数组,其中每一行都被这个函数处理过 我试过了 answer = np.array([]) for row in my_data: answer = np.append(answe

我有一个名为
my\u data
的2d numpy数组。每行表示关于一个数据点的信息,每列表示该数据点的不同属性

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

我怎样才能拥有一个numpy数组,其中每一行都被这个函数处理过

我试过了

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

但在最后,答案只是一个很长的行,而不是一个二维网格

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

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

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

此代码不正确,它给出了
AttributeError:'numpy.ndarray'对象没有属性'append'
。请包含我们可以运行以演示问题的整个代码段。请参阅postList append中编辑的代码段。np.append有太多的陷阱。重读它的文档。关于axis参数它说了什么?np.append-like-vstack很慢。如果没有axis,它会分散输入。您可能希望在cython或pandas中执行此操作,以提高性能,但如果没有有关流程的更多信息,则不清楚最佳策略是什么。我尝试了此方法,但速度太慢。在我退出之前,它运行了10分钟。我认为
answer=np.vstack([answer,process\u row(row)])
需要线性时间,因为它每次都复制
answer
,所以总体上需要O(n^2)个时间@Aklys的解决方案运行得更快,所以我接受他的方案solution@quantumbutterfly是的,他的答案和我最后的答案是一样的,“你最好是列表理解”。。。只是更详细。哦,哎呀,忽略了那部分。对不起