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是的,他的答案和我最后的答案是一样的,“你最好是列表理解”。。。只是更详细。哦,哎呀,忽略了那部分。对不起