0

简而言之......这是问题所在:

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)
4

3 回答 3

2

作为函数参数的表达式在传递给函数之前会被评估(文档链接)。a[a]因此,即使在np.where调用之前,您也会从表达式中得到索引错误。

于 2012-10-25T09:33:18.147 回答
1

使用以下内容:

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

文档所述:

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]]: 失败,因为a有少于 100 个元素......


另一种方法是:

a_copy = a.copy()
a_copy[a==100] = -1

(如果你想就地改变它,请替换a_copy为)a

于 2012-10-25T08:48:56.340 回答
0

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

于 2012-10-25T08:56:49.347 回答