猿问

如何在不使用 np.apply_along_axis() 的情况下在锯齿状 Numpy ?

我正在尝试加快进程,我认为这可能使用 numpy 的 apply_along_axis 来实现。问题是并非我所有的轴都具有相同的长度。


当我做:


a = np.array([[1, 2, 3], 

              [2, 3, 4], 

              [4, 5, 6]])

b = np.apply_along_axis(sum, 1, a)

print(b)

这工作正常。但我想做类似的事情(请注意,第一行有 4 个元素,其余有 3 个):


a = np.array([[1, 2, 3, 4], 

              [2, 3, 4], 

              [4, 5, 6]])

b = np.apply_along_axis(sum, 1, a)

print(b)

但这失败了,因为:


numpy.AxisError:轴 1 超出维度 1 数组的范围


我环顾四周,发现唯一的“解决方案”是添加零以使所有数组的长度相同,这可能会破坏性能改进的目的。


有没有办法在非规则形状的 numpy 数组上使用 numpy_apply_along_axis ?


蛊毒传说
浏览 93回答 2
2回答

至尊宝的传说

您可以通过以矢量化方式用零填充它们来将可迭代对象的初始数组转换为 ndarray:import numpy as npa = np.array([[1, 2, 3, 4],               [2, 3, 4],               [4, 5, 6]])max_len = len(max(a, key = lambda x: len(x))) # max length of iterable-objects contained in arraycust_func = np.vectorize(pyfunc=lambda x: np.pad(array=x,                                                  pad_width=(0,max_len),                                                  mode='constant',                                                  constant_values=(0,0))[:max_len], otypes=[list])a_pad = np.stack(cust_func(a))输出:array([[1, 2, 3, 4],       [2, 3, 4, 0],       [4, 5, 6, 0]])

红颜莎娜

这取决于。您之前知道向量的大小还是要添加到列表中?参见例如http://stackoverflow.com/a/58085045/7919597例如,您可以填充数组import numpy as npa1 = [1, 2, 3, 4]a2 = [2, 3, 4, np.nan] # pad with nana3 = [4, 5, 6, np.nan] # pad with nanb = np.stack([a1, a2, a3], axis=0)print(b)# you can apply the normal numpy operations on # arrays with nan, they usually just result in a nan# in a resulting arrayc = np.diff(b, axis=-1)print(c)之后,您可以在列上的每一行上应用一个移动窗口。看看https://stackoverflow.com/a/22621523/7919597,它只有 1d,但可以让您了解它是如何工作的。可以通过 scipy.signal.convolve2d 使用只有一行作为内核的二维数组(形状例如 (1, 3)),并使用上面的想法。这是获得“逐行一维卷积”的解决方法:from scipy import signalkrnl = np.array([[0, 1, 0]])d = signal.convolve2d(c, krnl, mode='same')print(d)
随时随地看视频慕课网APP

相关分类

Python
我要回答