相关疑难解决方法(0)

从给定步幅/步长的numpy数组中取出子阵列

假设我有一个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?

python numpy vectorization

25
推荐指数
2
解决办法
5634
查看次数

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 大小的窗口情况,是否有更有效的方法不需要循环?

编辑2:

事实证明,该问题等同于询问如何对具有大小为 n 的窗口的列表执行 1d 最大池化。有谁知道如何有效地实现这一点?

python numpy max-pooling

15
推荐指数
4
解决办法
519
查看次数

用numpy滚动最大

这将计算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计算滚动最大值?

python numpy

3
推荐指数
2
解决办法
859
查看次数

Pandas 中滚动最大值的 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)

python performance numpy pandas rolling-computation

2
推荐指数
1
解决办法
767
查看次数

Python:在列表中查找最大元素索引

我有一个清单

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

python for-loop list

0
推荐指数
1
解决办法
70
查看次数