我有一个大约有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循环并读取和写入每个值之外,还有另一种方法可以做到这一点吗?
由于
答案 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函数可以帮助处理这种代码: