我有一个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数组具有具有这些交替值的一列
答案 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
与它的后继值(每列)一起使用,则应该有三个可能的值:0
,255
,-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