Python / Numpy-填补非连续点之间的空白?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python / Numpy-填补非连续点之间的空白?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1965字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试找到一种向量化/快速/ numpy友好的方式,将A列中的以下值转换为B列:
ID A B
1 0 0
2 0 0
3 1 0
4 1 1
5 0 1
6 0 1
7 -1 1
8 0 0
9 1 0
10 0 1
11 0 1
12 1 1
13 0 1
14 -1 1
15 0 0
定义“ B”列的算法将使用值1填充1和-1组之间的所有间隙,从而跳过每对中的第一行.也就是说,对于ID4-ID7,B列用1填充(假定A列中的起始1 @ ID3).接下来,在ID10-ID14中用1填充(因为列A @ ID9 = 1).
尽管使用for循环很容易做到这一点,但我想知道是否存在非循环解决方案?基于O(n)循环的解决方案如下:
import numpy as np
import pandas as pd
x = np.array([ 0, 0, 1, 1, 0 ,0, -1, 0, 1, 0 , 0, 1, 0, -1, 0])
def make_y(x,showminus=False):
y = x * 0
state = 0 # are we in 1 or 0 or -1
for i,n in enumerate(x):
if n == 1 and n != state:
state = n
if i < len(y)-1:
y[i+1] = state
elif n == -1 and n != state:
y[i] = state
if showminus:
state = -1
else:
state = 0
else:
y[i] = state
return y
y = make_y(x)
print pd.DataFrame([x,y]).T
上面的函数在我的机器上产生以下性能:
%timeit y = make_y(x)
10000 loops, best of 3: 28 μs per loop
我猜测必须有某种方法可以使整个过程更快,因为我最终将需要处理长度为1000万个元素的数组.
解决方法:
可能的矢量化解决方案如下
idx_1s, = np.where(x == -1) # find the positions of the -1's
idx1s, = np.where(x == 1) # find the positions of the 1's
要查找哪个1应该变成0并标记一个1的块的开始:
idx0s = np.concatenate(([0], np.searchsorted(idx1s, idx_1s[:-1])))
idx0s = idx1s[idx0s]
现在,我们有两个长度相等的数组idx0s和idx_1s,标记每个块的第一项和最后一项的位置,因此我们现在可以这样做:
y = x.copy()
y[idx0s] = 0
idx0s += 1
idx_1s += 1
mask = np.zeros_like(y, dtype=np.bool)
mask[idx0s] = True
mask[idx_1s] = True
mask = np.logical_xor.accumulate(mask)
y[mask] = 1
产生所需的:
>>> y
array([0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0])
输入格式错误可能有点脆弱,我认为它不会优雅地处理-1.但是唯一的非O(n)操作是对searchsorted的调用,但是searchsorted具有优化功能,可以更快地搜索已排序的键,因此可能不会引起注意.
如果我在您的x上计时,它不会超越循环版本,但是对于更大的数组,它可能会胜过.
内容总结
以上是互联网集市为您收集整理的Python / Numpy-填补非连续点之间的空白?全部内容,希望文章能够帮你解决Python / Numpy-填补非连续点之间的空白?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。