相关疑难解决方法(0)

如何比quicksort更快地对整数数组进行排序?

用numpy的快速排序对整数数组进行排序已经成为我算法的瓶颈.不幸的是,numpy还没有 基数排序.虽然计算排序将是numpy中的单行:

np.repeat(np.arange(1+x.max()), np.bincount(x))
Run Code Online (Sandbox Code Playgroud)

看到我如何对这个python计数排序进行矢量化的接受答案,以便它绝对尽可能快?问题,我的应用程序中的整数可以运行02**32.

我坚持使用quicksort吗?


这篇文章的主要动机是使用itertools.groupby性能 问题进行 Numpy分组.
另请注意, 提出并回答您自己的问题不仅可以,而且明确鼓励.

python sorting algorithm performance numpy

11
推荐指数
1
解决办法
1369
查看次数

计算在numpy数组中长度变化的值的连续出现次数

假设我在numpy数组中有一堆数字,我根据返回布尔数组的条件测试它们:

np.random.seed(3456)
a = np.random.rand(8)
condition = a>0.5
Run Code Online (Sandbox Code Playgroud)

有了这个布尔数组,我想计算连续出现的True的所有长度.例如,如果我有,[True,True,True,False,False,True,True,False,True]我想要回来[3,2,1].

我可以使用此代码执行此操作:

length,count = [],0
for i in range(len(condition)):

    if condition[i]==True:
        count += 1
    elif condition[i]==False and count>0:
        length.append(count)
        count = 0

    if i==len(condition)-1 and count>0:
        length.append(count)

    print length
Run Code Online (Sandbox Code Playgroud)

但是,是否有任何已经实现的功能或python,numpy,scipy等函数计算给定输入的列表或数组中连续出现的长度?

python arrays numpy

10
推荐指数
2
解决办法
8165
查看次数

从2D numpy数组中删除运行

给定2D numpy数组:

00111100110111
01110011000110
00111110001000
01101101001110
Run Code Online (Sandbox Code Playgroud)

是否有替代运行的有效方式,1这是>= N长?

例如,如果 N=3

00222200110222
02220011000110
00222220001000
01101101002220
Run Code Online (Sandbox Code Playgroud)

实际上,2D数组是二进制的,我想用0替换1的运行,但为了清楚起见,我在上面的例子中用2替换它们.

Runnable示例:http://runnable.com/U6q0q-TFWzxVd_Uf/numpy-replace-runs-for-python

我目前使用的代码看起来有点hacky,我觉得可能有一些神奇的numpy方式:

更新:我知道我将示例更改为不处理极端情况的版本.这是一个小的实现错误(现已修复).如果有更快的方法,我更感兴趣.

import numpy as np
import time

def replace_runs(a, search, run_length, replace = 2):
  a_copy = a.copy() # Don't modify original
  for i, row in enumerate(a):
    runs = []
    current_run = []
    for j, val in enumerate(row):
      if val == search:
        current_run.append(j)
      else:
        if len(current_run) >= run_length or j == len(row) -1:
          runs.append(current_run) …
Run Code Online (Sandbox Code Playgroud)

python arrays algorithm numpy

8
推荐指数
1
解决办法
265
查看次数

最有效的方法来汇总巨大的2D NumPy数组,按ID列分组?

我有一个海量数据阵列(500k行),看起来像:

id  value  score
1   20     20
1   10     30
1   15     0
2   12     4
2   3      8
2   56     9
3   6      18
...
Run Code Online (Sandbox Code Playgroud)

如您所见,左侧有一个非唯一ID列,第三列中有各种分数.

我希望快速添加按ID分组的所有分数.在SQL中,这看起来像SELECT sum(score) FROM table GROUP BY id

使用NumPy,我尝试迭代每个ID,按每个ID截断表,然后将该表的得分相加.

table_trunc = table[(table == id).any(1)]
score       = sum(table_trunc[:,2])
Run Code Online (Sandbox Code Playgroud)

不幸的是,我发现第一个命令是狗慢.有没有更有效的方法来做到这一点?

python numpy

6
推荐指数
1
解决办法
3483
查看次数

如何对相同布尔值的块进行分组?

假设我有以下列表:

a = [True, True, True, False, False, False, False, True, True]
Run Code Online (Sandbox Code Playgroud)

怎样才能让他们最好只要么返回分组037或分组像下面这样?

[True, True, True]
[False, False, False, False]
[True, True]
Run Code Online (Sandbox Code Playgroud)

背景:我试图在我的 NumPy 数组中找到平台,虽然将导数设置为零是一个好的开始,但我仍然需要将数组排序为块。我认为这基本上归结为上述问题。

我查找了 NumPy 和 itertools(试图从问题NumPy grouping using itertools.groupby performance 中获得解决方案)但我没有成功。我想人们可能会使用itertools.takewhile和 filtfalse的组合(请参阅此处的文档),但我对此并不了解。或者也许我只是想得太复杂了。

python numpy python-itertools

3
推荐指数
1
解决办法
687
查看次数

将 numpy 数组拆分为满足条件的段

我有一个像这样的数组:

arr = np.array([1, 2, 3, 4, -5, -6, 3, 5, 1, -2, 5, -1, -1, 10])
Run Code Online (Sandbox Code Playgroud)

我想删除所有负值,并在存在负值的每个索引处拆分数组。结果应该是这样的:

split_list = [[1, 2, 3, 4], [3, 5, 1], [5], [10]]
Run Code Online (Sandbox Code Playgroud)

我知道如何使用列表理解来做到这一点,但由于数组可能变得很大并且我必须进行多次计算,所以我想使用 numpy 找到一个解决方案。我发现了这个https://www.geeksforgeeks.org/python-split-list-into-lists-by-prefer-value/,我可以用它来分割存在负值的数组,但我不能同时进行删除它们。

python arrays numpy

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