Python 检查numpy数组中的不变列

Python 检查numpy数组中的不变列,python,arrays,numpy,Python,Arrays,Numpy,我有一个大的二维numpy字符数组(dtype='a1'),并希望找到始终包含相同字符的不变列。下面的代码可以工作,但速度很慢 var_col = np.zeros(a.shape[1], dtype='bool') for c in xrange(a.shape[1]): if not all(a[:,c] == a[0,c]): var_col[c] = True 这个问题有没有更快的解决方案? 谢谢 这里有一种方法,使用=操作符进行广播 首先创建一个测试数组 In

我有一个大的二维numpy字符数组(dtype='a1'),并希望找到始终包含相同字符的不变列。下面的代码可以工作,但速度很慢

var_col = np.zeros(a.shape[1], dtype='bool')
for c in xrange(a.shape[1]):
    if not all(a[:,c] == a[0,c]):
        var_col[c] = True
这个问题有没有更快的解决方案?
谢谢

这里有一种方法,使用
=
操作符进行广播

首先创建一个测试数组

In [27]: np.random.seed(1)

In [28]: a = np.random.choice(list("AABC"), size=(3,9))

In [29]: a
Out[29]: 
array([['A', 'C', 'A', 'A', 'C', 'A', 'C', 'A', 'C'],
       ['A', 'A', 'A', 'A', 'C', 'A', 'A', 'B', 'A'],
       ['B', 'A', 'B', 'A', 'B', 'A', 'C', 'A', 'B']], 
      dtype='|S1')
将每个元素与其列顶部的元素进行比较
a[0]
是第一行;它是一个一维数组(形状是(9,))。当我们将
==
与这样的两个数组一起使用时,
a[0]
被“广播”以充当具有形状(3,9)的数组,其中填充了第一行的副本

In [30]: a == a[0]
Out[30]: 
array([[ True,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True, False,  True,  True,  True,  True, False, False, False],
       [False, False, False,  True, False,  True,  True,  True, False]], dtype=bool)
现在沿比较结果的第一个轴使用
all

In [31]: np.all(a == a[0], axis=0)
Out[31]: array([False, False, False,  True, False,  True, False, False, False], dtype=bool)

伟大的“矢量化”解决方案!这就是我要找的,谢谢!