用numpy的快速排序对整数数组进行排序已经成为我算法的瓶颈.不幸的是,numpy还没有 基数排序.虽然计算排序将是numpy中的单行:
np.repeat(np.arange(1+x.max()), np.bincount(x))
Run Code Online (Sandbox Code Playgroud)
看到我如何对这个python计数排序进行矢量化的接受答案,以便它绝对尽可能快?问题,我的应用程序中的整数可以运行0到2**32.
我坚持使用quicksort吗?
这篇文章的主要动机是使用itertools.groupby性能
问题进行
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等函数计算给定输入的列表或数组中连续出现的长度?
给定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) 我有一个海量数据阵列(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)
不幸的是,我发现第一个命令是狗慢.有没有更有效的方法来做到这一点?
假设我有以下列表:
a = [True, True, True, False, False, False, False, True, True]
Run Code Online (Sandbox Code Playgroud)
怎样才能让他们最好只要么返回分组0,3,7或分组像下面这样?
[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的组合(请参阅此处的文档),但我对此并不了解。或者也许我只是想得太复杂了。
我有一个像这样的数组:
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/,我可以用它来分割存在负值的数组,但我不能同时进行删除它们。