假设我有一个Python Numpy数组a.
a = numpy.array([1,2,3,4,5,6,7,8,9,10,11])
Run Code Online (Sandbox Code Playgroud)
我想从这个长度为5的数组创建一个子序列矩阵,步长为3.结果矩阵因此如下所示:
numpy.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])
Run Code Online (Sandbox Code Playgroud)
实现这一点的一种可能方式是使用for循环.
result_matrix = np.zeros((3, 5))
for i in range(0, len(a), 3):
result_matrix[i] = a[i:i+5]
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方法来实现这个Numpy?
我有一个 numpy 数组:
A = np.array([8, 2, 33, 4, 3, 6])
Run Code Online (Sandbox Code Playgroud)
我想要的是创建另一个数组 B,其中每个元素都是 A 中 2 个连续对的成对最大值,所以我得到:
B = np.array([8, 33, 33, 4, 6])
Run Code Online (Sandbox Code Playgroud)
关于如何实施的任何想法?
关于如何为超过 2 个元素实现这一点的任何想法?(同样的事情,但对于连续的 n 个元素)
答案给了我解决这个问题的方法,但是对于 n 大小的窗口情况,是否有更有效的方法不需要循环?
事实证明,该问题等同于询问如何对具有大小为 n 的窗口的列表执行 1d 最大池化。有谁知道如何有效地实现这一点?
这将计算A
一个长度为的滑动窗口上的“滚动最大值” (类似于滚动平均值)K
:
import numpy as np
A = np.random.rand(100000)
K = 10
rollingmax = np.array([max(A[j:j+K]) for j in range(len(A)-K)])
Run Code Online (Sandbox Code Playgroud)
但我认为,就性能而言,这远非最佳。
我知道该pandas
库具有rolling_max
,但是在我的项目中,我不想使用这种新的依赖关系。
问题:是否有一种简单的方法仅使用numpy计算滚动最大值?
TL;DR:我的问题是如何改进我的功能以超越熊猫自己的最大移动功能?
背景资料:
所以我正在处理很多移动平均线、移动最大值和移动最小值等,到目前为止我发现的唯一像特征一样的移动窗口是在pandas.rolling 方法中。问题是:我拥有的数据是 numpy 数组,我想要的最终结果也必须在 numpy 数组中;就像我想简单地将它转换为熊猫系列并返回到 numpy 数组来完成这样的工作:
result2_max = pd.Series(data_array).rolling(window).max().to_numpy()
Run Code Online (Sandbox Code Playgroud)
,这太非pythonic了,因为转换数据类型似乎没有必要,而且可能有一些方法可以纯粹在numpy实现中做完全相同的事情。
然而,尽管它看起来不像 Python,但它比我在网上提出或看到的任何方法都要快。我将在下面给出一些小基准:
import numpy as np
import pandas as pd
def numpy_rolling_max(data, window):
data = data[::-1]
data_strides = data.strides[0]
movin_window = np.lib.stride_tricks.as_strided(data,
shape=(data.shape[0] - window +1, window),
strides = (data_strides ,data_strides)
)[::-1]
max_window =np.amax(movin_window, axis = 1)#this line seems to be the bottleneck
nan_array = np.full(window - 1, np.nan)
return np.hstack((nan_array, max_window))
def pandas_rolling_max(data, window):
return pd.Series(data).rolling(window).max().to_numpy()
length = 120000
window = 190
data …
Run Code Online (Sandbox Code Playgroud) 我有一个清单
arr = [0, 1, 45, 2, 40, 3, 70, 4, 45, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
其中我试图使用以下代码从 3 个连续元素中找到最大元素的位置/索引:
for i in range (0, len(arr)-3):
print(arr.index(max(arr[i : i+3])))
Run Code Online (Sandbox Code Playgroud)
当i
转到位置 7 时,它给出了错误的结果。
结果应该是:
2 2 2 4 6 6 6 8 8 11 12
而是相反
2 2 2 4 6 6 6 2 2 11 12