(Python)如何使用[:]语法对数组的每个元素使用条件语句?

2024-05-10 01:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我需要对整数的numpy.ndarray中的每个元素都要求一个条件,那么我必须使用for循环吗

for i in range(n):
    if a[i] == 0:
        a[i] = 1   

或者我可以用[:]语法问这个问题吗

if a[:] == 0:
    #...

我知道前一个是错误的,但有没有办法做类似的事情?


Tags: innumpy元素forif错误语法range
3条回答

假设a是数组,并且希望将大于1的a值更改为等于1:

a[a > 1] = 1

这是因为表达式a > 1创建了mask array,并且当掩码数组用作索引(它在这里)时,该操作仅适用于True索引。

对于同时在numpy.ndarray的每个元素上测试条件,如标题所示:

使用numpy的^{}来实现:

if np.all(a == 0):
    # ...

尽管它不是懒惰的,np.all被矢量化并且非常快

# 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

编辑:根据操作人员的评论精确

您可以使用^{}内置函数来完成您的要求:

all(i == 0 for i in a)

示例:

>>> a = [1, 0, 0, 2, 3, 0]
>>> all(i == 0 for i in a)
False

但是请注意,在场景后面,all仍然使用for循环。It's just implemented in C

for (;;) {
    item = iternext(it);
    if (item == NULL)
        break;
    cmp = PyObject_IsTrue(item);
    Py_DECREF(item);
    if (cmp < 0) {
        Py_DECREF(it);
        return NULL;
    }
    if (cmp == 0) {
        Py_DECREF(it);
        Py_RETURN_FALSE;
    }

编辑:鉴于您最近的编辑,您可能希望使用三元运算符的列表理解:

[1 if  i == 0 else i for i in a]

示例:

>>> a = [1, 0, 0, 2, 3, 0]
>>> [1 if  i == 0 else i for i in a]
[1, 1, 1, 2, 3, 1]

相关问题 更多 >