Python 确定栅格中连续相同点的数量

Python 确定栅格中连续相同点的数量,python,pandas,numpy,scipy,Python,Pandas,Numpy,Scipy,我有数据帧,网格大小为12*8 我想计算连续红点的数量(仅在垂直方向),并用它创建新列(col=连续红),对于蓝色,它将为零 比如说 X y red/blue consecutive red 1 1 blue 0 1 3 red 3 1 4 red 3 1 2 blue 0 1 5 red 3 9 4 red 5 [![在此处输入图像描述][1][1] 已经有前3列的数据 from sklearn.neighbors impo

我有数据帧,网格大小为12*8
我想计算连续红点的数量(仅在垂直方向),并用它创建新列(col=连续红),对于蓝色,它将为零

比如说

X y red/blue consecutive red 
1 1  blue    0
1 3  red     3     
1 4  red     3
1 2  blue    0
1 5  red     3
9 4  red     5
[![在此处输入图像描述][1][1] 已经有前3列的数据

from sklearn.neighbors import BallTree 

red_points = df[df.red/blue== red]
blue_points = df[df.red/blue!= red]

tree = BallTree(red_points[['x','y']], leaf_size=40, metric='minkowski')

distance, index = tree.query(df[['x','y']], k=2)

我不知道有这样的算法(很可能有),但是编写算法并不是那么难(我使用numpy是因为我已经习惯了,而且你可以轻松地使用CUDA和其他数据科学python工具进行加速)

数据(0=蓝色,1=红色):

算法:

result = np.zeros((ROWS,COLS),dtype=np.int)
for y,x in np.ndindex(X.shape):
    if X[y, x]==0:
        continue
    cons = 1 # consecutive in any direction including current
    # Going backwward while we can
    prev = y-1
    while prev>=0:
        if X[prev,x]==0:
            break
        cons+=1
        prev-=1
    # Going forward while we can
    nxt = y+1
    while nxt<=ROWS-1:
        if X[nxt,x]==0:
            break
        cons+=1
        nxt+=1
    result[y,x]=cons
df2 = pd.DataFrame(data=result)
df2.style.apply(lambda x: [bg+'red' if v>=1 else bg+'blue' for v in x])
result=np.zero((行,列),dtype=np.int)
对于np.ndindex(x.shape)中的y,x:
如果X[y,X]==0:
持续
cons=1#在任何方向上连续,包括电流
#我们可以回去了
prev=y-1
当prev>=0时:
如果X[prev,X]==0:
打破
cons+=1
prev-=1
#趁我们能继续前进
nxt=y+1
当nxt=1时,其他bg+“蓝色”表示x中的v])
结果是:


请注意,在numpy中,第一个坐标表示行索引(在您的情况下为y),第二个坐标表示列(在您的情况下为x),如果您想切换到x,y,您可以在数据上使用。

请共享您更新帖子时使用的代码,我首先尝试使用sklearn中的Ball tree计算每个点到红点的索引和距离,然后我想你需要澄清预期的输出。在你关于
[x,y]=#continuous
的例子中,你给出了
[1,3]=3
[1,5]=3
,但
[1,4=0]
似乎是错误的,如果你认为
在任何方向上都是连续的,包括当前的
,或者
[1,4]=3
,如果你认为
邻居+当前的
。此外,如果你感兴趣的是每个X坐标的红色组列表,则可能有较少的冗余输出(即对于x=1,它将是[3),对于x=9,它将是[2,5])。[1,4]是3,它是错的,现在纠正,输出将只考虑在垂直方向上,并且包括两个方向上的电流nOnthistic,对吗?否则它将是[1,4]=2这正是我想要的谢谢,我唯一的疑问是我的数据集是96*2(x&y坐标),而不是12*8如果它正是你想要的,你可以把我的答案标记为正确。数据集的大小并不重要,只要它仍然是二维的,如果更高的维度您必须相应地进行调整,以使core更一般地平坦3+维度,以便相同的代码逻辑可以向上扩展,这就是用例,想知道这种算法在哪种情况下有用吗这里你用19*9创建了df,给每个单元格一个值(红色/蓝色),但我有3列要用x,y和红色/蓝色,这里我需要做。重塑(12,8),但问题是在一些df中,我的值小于96(12*8),然后它给出了错误我明白了,那么,在这种情况下,我认为您最好将特性表示的学习留给您的网络(这是它们如此强大的原因之一,硬编码您认为相关的内容,或者在某种程度上不会弄巧成拙)。例如,你可以将你的焊缝表示为一个图像(例如一个热图,表示焊缝的良好/部分,类似于我的表格输出,但只是使用颜色),然后让神经网络计算出来。请参阅和“图像识别器可以处理非图像任务”部分。
result = np.zeros((ROWS,COLS),dtype=np.int)
for y,x in np.ndindex(X.shape):
    if X[y, x]==0:
        continue
    cons = 1 # consecutive in any direction including current
    # Going backwward while we can
    prev = y-1
    while prev>=0:
        if X[prev,x]==0:
            break
        cons+=1
        prev-=1
    # Going forward while we can
    nxt = y+1
    while nxt<=ROWS-1:
        if X[nxt,x]==0:
            break
        cons+=1
        nxt+=1
    result[y,x]=cons
df2 = pd.DataFrame(data=result)
df2.style.apply(lambda x: [bg+'red' if v>=1 else bg+'blue' for v in x])