我有一个2D数组,其中我需要独立处理每个“列”(axis= 1)。对于每列(1D 数组),我需要一个应用于 1D 数组的每个长度尾部的函数,以提供长度为 N 的数组,如下所示。如何让它更快?也许通过删除 for 循环。我用map/lambda/hstack来做这件事,直到我命中了除以零的错误,这需要if/elif/else条件来消除行进到无穷大。
import numpy as np
x = np.random.rand(20,5)
def get_updown_array(loc_array):
return np.array([updown(loc_array[x:]) for x in list(range(loc_array.shape[0]))])
def updown(local_array):
sub_length = ((local_array.shape[0]) + 1) // 2 # to get the middle value when length is uneven
a = local_array[:sub_length].mean() # first half mean
b = local_array[-sub_length:].mean() # second half mean
if not a == 0:
return ( b - a ) / abs(a)
elif not b == 0:
return ( b - a ) / abs(( a + b ) / 2)
else:
return 0
result = np.apply_along_axis(get_updown_array, 0, x)
if/else 条件逻辑似乎消除了同时在一个 numpy 维度中跨多个值应用函数的能力。
我研究了如何使用veyize,尽管这似乎仍然需要第一个函数中的for循环。
我看了 pandas.apply,虽然它看起来更慢,之后仍然需要一个连接或 vstack/hstack?
Cython被考虑过,尽管这仍然让不雅的循环咯吱咯吱咯吱地溜走了。
我尝试了np.where,尽管这仍然需要一个for循环。
有没有办法在没有for循环的情况下将数学/逻辑应用于每个长度的尾部?最快的方法是什么?堆栈溢出社区。
噜噜哒
相关分类