如何检查numpy数组中的列中的值

时间:2018-08-07 14:31:01

标签: python arrays numpy

我有一个numpy数组,

> [[  0   0   0   0   0]
 [  0   0   0   0   0]
 [  0   0   0   0   0]
 ...
 [  0 255   0 255   0]
 [  0 255   0   0   0]
 [  0 255   0   0   0]]

我想检查此2d numpy数组的每一列中的值-是否有不止一列具有交替的0和255值

示例列

>   [[  0 0   0 255   0]
     [  0 255 0   0   0]
     [  0 255 0   0   0]
     [  0 255 0   0   0]
     [  0 0   0   0   0]
     [  0 0   0   0   0]
     [  0 0   0   0   0]
     [  0 0   0   0   0]
     [  0 255 0   0   0]
     [  0 255 0   0   0]
     [  0 255 0   0   0]
     [  0 255 0   0   0]
     [  0 255 0   0   0]]

在上面的示例中,第二列具有0和255的交替值,因此,输出应为此numpy数组具有具有这些交替值的一列

4 个答案:

答案 0 :(得分:1)

np.sum(np.count_nonzero(np.diff(a, axis=0), axis=0) > 1)

答案 1 :(得分:0)

我不明白第二列如何具有0和255的替代值,但这是一个主意...

>>> unique, counts = numpy.unique(numpy.transpose(nd_a)[0], return_counts=True)
>>> counts
array([13], dtype=int64)
>>> unique, counts = numpy.unique(numpy.transpose(nd_a)[1], return_counts=True)
>>> counts
array([5, 8], dtype=int64)

如果len(nd_a)与计数相同,则它不是交替的,但是如果值有些相似(例如5和8取5/13和8/13),则其交替。

答案 2 :(得分:0)

假设“交替”是指同一值多次出现而不与其他出现相邻:

如果您将每一行值的diff与它的后继值(每列)一起使用,则应该有三个可能的值:0255-255。仅具有交替值的列将同时具有255-255。测试这两个diff值的存在(使用一些Pandas方法)将为您提供答案。

import pandas as pd

def check_alt(data):
    return (pd.DataFrame(data)
            .diff()
            .apply(lambda x: x.value_counts())
            .loc[[-255,255]]
            .notnull()
            .all()
            .sum())

check_alt(a) # 2
check_alt(b) # 4

数据:

a = [[0,0,0,255,0],
[0,255,0,0,255],
[0,255,0,0,0],
[0,255,0,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,255,0,0,0],
[0,255,0,0,0],
[0,255,0,0,0],
[0,255,0,0,0],
[0,255,0,0,0]]

b = [[0,0,0,255,0],
[255,255,0,0,255],
[0,0,0,255,0]]

嵌套列表a是您的示例数据。我还添加了一个额外的数组b,以演示仅不断变化的值(即,每个下一个值都不是它之前的值)的边缘情况。 b的交替列的预期计数为4。

答案 3 :(得分:0)

这是另一种解决方案;

import numpy as np

#construct numpy array
c = np.zeros((15,5)) # Pre-allocate matrix


#populate some columns with number patterns

c[1:4,1] = 255
c[8:13,1] = 255

c[1,3] = 255

c[1:4,4] = 255
c[7:12,4] = 255

OUT = np.empty(shape=[15,0])

for ni in range(0,c.shape[1]):
    #work on column ni from c
    a = c[:,ni] #work on array a
    b = np.diff(a) #differene between neighbouring elements
    d = np.where(b != 0) #work out where the transitions from 0->255 or 255->0 are

    #work out what constitutes an alternating pattern (you may want to change the logic)
    if np.size(d) > 2:
        #this column from C has been deemed to have an alternating pattern
        OUT = np.append(OUT, c[:,ni:ni+1], axis=1) # add the column to the OUT array