numpy.where()子句错误

时间:2012-10-25 08:42:39

标签: python arrays numpy

简单地说......这就是问题:

import numpy as np
a = np.array([ 0, 1, 2, 3, 4, 5, 6, 100, 8, 9])
np.where(a==100, -1, a[a])

我期望获得的是:0, 1, 2, 3, 4, 5, 6, -1, 8, 9 相反,我得到:index 100 out of bounds 0<=index<10

我承认索引无效,但是不应该eval a [100]而是-1而不是......据我所知numpy.where()命令结构。

在这个例子中我做错了什么?

只是为了澄清我在这里尝试做的更详细的代码: 它是一个查找表数组重映射程序:

import numpy as np

# gamma-ed look-up table array
lut = np.power(np.linspace(0, 1, 32), 1/2.44)*255.0

def gamma(x):
    ln = (len(lut)-1)
    idx = np.uint8(x*ln)
    frac = x*ln - idx
    return np.where( frac == 0.0,
                    lut[idx],
                    lut[idx]+(lut[idx+1]-lut[idx])*frac)

# some linear values array to remap
lin = np.linspace(0, 1, 64)

# final look-up remap
gamma_lin = gamma(lin)

3 个答案:

答案 0 :(得分:2)

作为函数参数放置的表达式在传递给函数(Documentation link)之前会被计算。因此,即使在调用a[a]之前,您也会从表达式np.where中获得索引错误。

答案 1 :(得分:1)

使用以下内容:

np.where(a==100, -1, a)

正如documentation所说:

numpy.where(condition[, x, y])

Return elements, either from x or y, depending on condition.
If only condition is given, return condition.nonzero().

此处,a==100是您的条件,-1符合条件时应采取的值(True),a值可以依赖。


你得到IndexError的原因是你的a[a]:你自己索引数组a,这相当于a[[0,1,2,3,4,5,6,100,8,9]]:因为{{}而失败1}}少于100个元素...


另一种方法是:

a

(如果您想要更改a_copy = a.copy() a_copy[a==100] = -1 ,请a_copy替换

答案 2 :(得分:0)

当您编写a[a]时,您尝试从a获取索引0,1,2 ... 100 ...这就是为什么您获得索引超出范围的错误。你应该写np.where(a==100, -1, a) - 我认为这会产生你想要的结果。