将函数应用于numpy数组的每个矩阵

时间:2019-06-03 11:57:25

标签: python arrays numpy vectorization

我想对我的(6890,6890,3,3)numpy数组中的每个3x3矩阵应用一个函数。直到现在,我还尝试在一个较小的示例上使用矢量化,并使用一个无法实现的简单函数。

def myfunc(x):
    return np.linalg.norm(x)

m = np.arange(45).reshape(5,3,3)
t = m.shape[0]
r = np.zeros((t, t))

q = m[:,None,...] @ m.swapaxes(1,2) # m[i] @ m[j].T
f = np.vectorize(q, otypes=[np.float])
res = myfunc(f)

矢量化是否是有效解决此问题的正确方法,还是我应该尝试其他方法?我也研究了numpy.apply_along_axis,但这仅适用于一维子数组。

1 个答案:

答案 0 :(得分:1)

您需要遍历每个元素并应用函数:

import numpy as np

# setup function
def myfunc(x):
    return np.linalg.norm(x*2)

# setup data array
data = np.arange(45).reshape(5, 3, 3)

# loop over elements and update
for item in np.nditer(data, op_flags = ['readwrite']):
    item[...] = myfunc(item)

如果您需要对整个3x3数组应用功能,请使用:

out_data = []
for item in data:
    out_data.append(myfunc(item))

输出:

[14.2828568570857, 39.761790704142086, 66.4529909033446, 93.32202312423365, 120.24974012445931]