我有一个很大的二维numpy数组a字符(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
这个问题是否有更快的解决方案? 谢谢!
答案 0 :(得分:2)
这是一种方法,使用==
运算符进行广播。
首先创建一个测试数组。
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]
是第一行;它是一个1d数组(形状是(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)