计算numpy数组中一列中相同值的数量

门诺·范·迪克(Menno Van Dijk)

我正在寻找以下问题的解决方案:

假设我有一个形状为(4,4)的数组:

[5. 4. 5. 4.]
[2. 3. 5. 5.]
[2. 1. 5. 1.]
[1. 3. 1. 3.]

在此数组中,有一列的值“ 5”连续出现3次。也就是说,它们不会分散在整个列中,如下例所示。

[5.] # This
[1.] # Should
[5.] # Not
[5.] # Count

现在,假设我有一个形状(M,N)的较大数组,并且各个整数值在1-5的相同范围内。如何计算每列中一行出现的相同值的最大数量?此外,是否有可能获得这些值出现的索引?上面示例的预期输出为

Found 3 in a row of number 5 in column 2
(0,2), (1,2), (2,2)

我假设如果搜索应关注行,则实现方式将相似。如果不是,我很想知道这是怎么做到的。

迪卡卡

方法1

这是一种方法-

def find_longest_island_indices(a, values):
    b = np.pad(a, ((1,1),(0,0)), 'constant')
    shp = np.array(b.shape)[::-1] - [0,1]
    maxlens = []
    final_out = []
    for v in values:
        m = b==v        
        idx = np.flatnonzero((m[:-1] != m[1:]).T)
        s0,s1 = idx[::2], idx[1::2]        
        l = s1-s0
        maxidx = l.argmax()
        longest_island_flatidx = np.r_[s0[maxidx]:s1[maxidx]]            
        r,c = np.unravel_index(longest_island_flatidx, shp)
        final_out.append(np.c_[c,r])
        maxlens.append(l[maxidx])
    return maxlens, final_out

样品运行-

In [169]: a
Out[169]: 
array([[5, 4, 5, 4],
       [2, 3, 5, 5],
       [2, 1, 5, 1],
       [1, 3, 1, 3]])

In [173]: maxlens
Out[173]: [1, 2, 1, 1, 3]

In [174]: out
Out[174]: 
[array([[3, 0]]), array([[1, 0],
        [2, 0]]), array([[1, 1]]), array([[0, 1]]), array([[0, 2],
        [1, 2],
        [2, 2]])]

# With "pretty" printing
In [171]: maxlens, out = find_longest_island_indices(a, [1,2,3,4,5])
     ...: for  l,o,i in zip(maxlens,out,[1,2,3,4,5]):
     ...:     print "For "+str(i)+" : L= "+str(l)+", Idx = "+str(o.tolist())
For 1 : L= 1, Idx = [[3, 0]]
For 2 : L= 2, Idx = [[1, 0], [2, 0]]
For 3 : L= 1, Idx = [[1, 1]]
For 4 : L= 1, Idx = [[0, 1]]
For 5 : L= 3, Idx = [[0, 2], [1, 2], [2, 2]]

方法#2

经过一些修改并输出了最大长度岛的开始和结束索引,这是一个-

def find_longest_island_indices_v2(a, values):
    b = np.pad(a.T, ((0,0),(1,1)), 'constant')
    shp = b.shape
    out = []
    for v in values:
        m = b==v        
        idx = np.flatnonzero(m.flat[:-1] != m.flat[1:])
        s0,s1 = idx[::2], idx[1::2]        
        l = s1-s0
        maxidx = l.argmax()
        start_index = np.unravel_index(s0[maxidx], shp)[::-1]
        end_index = np.unravel_index(s1[maxidx]-1, shp)[::-1]
        maxlen = l[maxidx]
        out.append([v,maxlen, start_index, end_index])
    return out  

样品运行-

In [251]: a
Out[251]: 
array([[5, 4, 5, 4],
       [2, 3, 5, 5],
       [2, 1, 5, 1],
       [1, 3, 1, 3]])

In [252]: out = find_longest_island_indices_v2(a, [1,2,3,4,5])

In [255]: out
Out[255]: 
[[1, 1, (3, 0), (3, 0)],
 [2, 2, (1, 0), (2, 0)],
 [3, 1, (1, 1), (1, 1)],
 [4, 1, (0, 1), (0, 1)],
 [5, 3, (0, 2), (2, 2)]]

# With some pandas styled printing 
In [253]: import pandas as pd

In [254]: pd.DataFrame(out, columns=['Val','MaxLen','StartIdx','EndIdx'])
Out[254]: 
   Val  MaxLen StartIdx  EndIdx
0    1       1   (3, 0)  (3, 0)
1    2       2   (1, 0)  (2, 0)
2    3       1   (1, 1)  (1, 1)
3    4       1   (0, 1)  (0, 1)
4    5       3   (0, 2)  (2, 2)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用python / pandas计算一列中相同的顺序值的数量?

如何用numpy数组中的值替换一列?

pandas:计算一列中每一行的numpy数组的平均值

如何计算另一列中属于不同值的列中的所有相同值

如何对熊猫中的每一列进行分组并计算不丢失值的数量

计算一列中存在的不同数量的组合

从numpy数组的一列中减去

根据其他列中的值计算一列中唯一实例的数量

使用Numpy查找数组中行的组合,以使每一列的总和为相同的值

计算Excel中一列中的多个值

根据一列中唯一值的数量计算出的新变量

Pandas \ Python:如何计算一列中最后一个相同值的数量

如何计算Excel工作表中一列中的已填充单元格数量

PHP获取数组中一列的值

在第一列中基于未知的相同值对numpy数组进行切片的有效方法

合并多维数组,并对在另一列中具有相同值的列值求和

numpy:根据其中一列从矩阵中查找

Excel:计算一列中的单元格数量,直到它们的总和大于设置值

如何计算1列中的值与另一列的相同值的总和?

如何根据另一列计算值的数量?

在 Pandas 中,给定另一列的一组值,如何计算一列中一组值的概率?

在 Pandas 中创建一列,计算另一列中唯一值的数量

计算numpy数组中一行中重复元素的数量

计算另一列中具有相同值的对象数量

计算MYSQL中一列中的总项目类型和数量

计算结构数组中相同值的数量

计算不同列中相同值的数量

Excel - 计算列中不同值数量的公式,而不考虑来自另一列的指示值

如何计算数据帧一列中一维数组中的值数