ele*_*ora 16 python arrays numpy
在numpy中,如果所有行在2d数组中相等,是否有一种很好的惯用方法?
我可以做点什么
np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))])
这似乎将python列表与numpy数组混合,这些数组很难看,也可能很慢.
有更好/更整洁的方式吗?
Ale*_*ley 19
一种方法是检查数组的每一行arr是否等于第一行arr[0]:
(arr == arr[0]).all()
==对于整数值,使用相等是正常的,但是如果arr包含浮点值,则可以使用它np.isclose来检查给定容差内的相等性:
np.isclose(a, a[0]).all()
如果你的数组包含NaN并且你想避免棘手的NaN != NaN问题,你可以将这种方法与np.isnan:
(np.isclose(a, a[0]) | np.isnan(a)).all()
只需检查数组中唯一项的数字是否为1:
>>> arr = np.array([[1]*10 for _ in xrange(5)])
>>> len(np.unique(arr)) == 1
True
从unutbu的答案中获得灵感的解决方案:
>>> arr = np.array([[1]*10 for _ in xrange(5)])
>>> np.all(np.all(arr == arr[0,:], axis = 1))
True
您的代码的一个问题是您在申请之前首先创建了整个列表np.all().由于您的版本中没有发生短路,而不是如果您使用all()带有生成器表达式的Python会更好:
时间比较:
>>> M = arr = np.array([[3]*100] + [[2]*100 for _ in xrange(1000)])
>>> %timeit np.all(np.all(arr == arr[0,:], axis = 1))
1000 loops, best of 3: 272 µs per loop
>>> %timeit (np.diff(M, axis=0) == 0).all()
1000 loops, best of 3: 596 µs per loop
>>> %timeit np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))])
100 loops, best of 3: 10.6 ms per loop
>>> %timeit all(np.array_equal(M[0], M[i]) for i in xrange(1,len(M)))
100000 loops, best of 3: 11.3 µs per loop
>>> M = arr = np.array([[2]*100 for _ in xrange(1000)])
>>> %timeit np.all(np.all(arr == arr[0,:], axis = 1))
1000 loops, best of 3: 330 µs per loop
>>> %timeit (np.diff(M, axis=0) == 0).all()
1000 loops, best of 3: 594 µs per loop
>>> %timeit np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))])
100 loops, best of 3: 9.51 ms per loop
>>> %timeit all(np.array_equal(M[0], M[i]) for i in xrange(1,len(M)))
100 loops, best of 3: 9.44 ms per loop
| 归档时间: | 
 | 
| 查看次数: | 7917 次 | 
| 最近记录: |