# arrays of zeros
>>> a = np.zeros((1000000))
>>> %timeit np.all(a == 0) # vectorized, very fast
10000 loops, best of 3: 34.5 µs per loop
>>>%timeit all(i == 0 for i in a) # not vectorized...
100 loops, best of 3: 19.3 ms per loop
# arrays of non-zeros
>>> b = np.ones((1000000))
>>> %timeit np.all(b == 0) # not lazy, iterates through all array
1000 loops, best of 3: 498 µs per loop
>>> %timeit all(i == 0 for i in b) # lazy, return false at first 1
1000000 loops, best of 3: 561 ns per loop
# n-D arrays of zeros
>>> c = a.reshape((100, 1000)) # 2D array
>>> %timeit np.all(c == 0)
10000 loops, best of 3: 34.7 µs per loop # works on n-dim arrays
>>> %timeit all(i == 0 for i in c) # wors for a 1D arrays only
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
用于在numpy.ndarray的每个元素上迭代测试条件:
for i in range(n):
if a[i] == 0:
a[i] = 1
可以用np.where代替
a = np.where(a == 0, 1, a) # set value '1' where condition is met
假设
a
是数组,并且希望将大于1的a
值更改为等于1:这是因为表达式
a > 1
创建了mask array,并且当掩码数组用作索引(它在这里)时,该操作仅适用于True
索引。对于同时在numpy.ndarray的每个元素上测试条件,如标题所示:
使用numpy的^{} 来实现:
尽管它不是懒惰的,
np.all
被矢量化并且非常快用于在numpy.ndarray的每个元素上迭代测试条件:
可以用
np.where
代替编辑:根据操作人员的评论精确
您可以使用^{} 内置函数来完成您的要求:
示例:
但是请注意,在场景后面,
all
仍然使用for循环。It's just implemented in C:编辑:鉴于您最近的编辑,您可能希望使用三元运算符的列表理解:
示例:
相关问题 更多 >
编程相关推荐