如何使用条件和函数修改Numpy数组

时间:2015-07-08 14:22:52

标签: python-2.7 numpy

我有一个大约有8e6个元素的3d,我需要更改所有元素。我想做这样的事情

def func(x, index):
....


flat = array.reshape(-1)
flat[flat == 9999] = 0
flat[flat >= 0.2 and flat < 0.7] = func(flat, 0)
flat[flat >= 0.7 and flat < 1.5] = func(flat, 1)
flat[flat >= 0.7 and flat < 1.5] = func(flat, 2)
....
...

此代码无效。我已经尝试了np.nditer,但它不会让我检索每个索引的值,它似乎是检索整个数组。除了每个维度循环w / a循环并读取和写入每个值之外,还有另一种方法可以做到这一点吗?

由于

2 个答案:

答案 0 :(得分:3)

使用多个条件进行屏蔽时,需要使用按位运算符&

flat[(flat >= 0.2) & (flat < 0.7)] = ...

此外,由于你的掩码维度和func的结果可能不一样(我认为func确实对整个数组应用了某些东西),你应该做类似的事情:

mask = (flat >= 0.2) & (flat < 0.7)
flat[mask] = func(flat, 0)[mask]

如果你的func是元素的话,那就这样:

mask = (flat >= 0.2) & (flat < 0.7)
flat[mask] = func(flat[mask], 0)

然后对其他两个条件重复相同的过程。

作为奖励,您可以迭代所有下限范围并执行以下操作:

lower_bound = [0.2, 0.7, 1.5]
upper_bound = lower_bound[1:] + [np.inf]

for i in range(len(lower_bound)):
    mask = (flat >= lower_bound[i]) & (flat < upper_bound[i])
    flat[mask] = func(flat[mask], i)

如果您有100个范围,那将避免您编写100行。

答案 1 :(得分:1)

语法为flat[(flat >= 0.2) & (flat < 0.7)]且类似。请注意flat[--] = func(--)的右侧必须具有相同数量的元素,因此您需要在索引/屏蔽数组上调用func。

有一些NumPy函数可以帮助处理这种代码: