Python 按值和位置替换Numpy数组中的元素

Python 按值和位置替换Numpy数组中的元素,python,arrays,numpy,plot,gis,Python,Arrays,Numpy,Plot,Gis,我正在开发一个程序,该程序将使用numpy数组创建轮廓数据,并试图避免调用matplotlib 我有一个长度为L的数组,其中包含NxN个布尔数组。我想将其转换为一个LxNxN数组,例如,第一个内部数组中的“True”被替换为“red”,第二个内部数组中的“True”被替换为“blue”,以此类推 以下代码按预期工作: import numpy as np import pdb def new_layer(N,p): return np.random.choice(a=[False,Tr

我正在开发一个程序,该程序将使用numpy数组创建轮廓数据,并试图避免调用matplotlib

我有一个长度为L的数组,其中包含NxN个布尔数组。我想将其转换为一个LxNxN数组,例如,第一个内部数组中的“True”被替换为“red”,第二个内部数组中的“True”被替换为“blue”,以此类推

以下代码按预期工作:

import numpy as np
import pdb

def new_layer(N,p):
    return np.random.choice(a=[False,True],size=(N,N),p=[p,1-p])

a = np.array([new_layer(3,0.5),new_layer(3,0.5),new_layer(3,0.5)]).astype('object')

colors = np.array(["red","green","blue"])

for i in range(np.shape(a)[0]):
    b = a[i]
    b[np.where(b==True)] = colors[i]
    a[i] = b
print(a)
但我想知道是否有一种方法可以使用Numpy的内置工具(例如索引)实现同样的功能。我是Numpy的新来者,我怀疑有更好的方法来做到这一点,但我不知道会是什么。谢谢。

这里有一种方法-

a_bool = a.astype(bool)
a[a_bool] = np.repeat(colors,a_bool.sum((1,2)))
另一个扩展了
颜色
3D
-

a_bool = a.astype(bool)
colors3D = np.broadcast_to(colors[:,None,None],a.shape)
a[a_bool] = colors3D[a_bool]

您可以使用
np.copyto

np.copyto(a, colors[:, None, None], where=a.astype(bool))

您可以使用布尔索引和。您还可以使用
a
作为自身的索引。然后你可以用这行代码做你在for循环中做的事情(尽管我不认为这一定是个好主意):

另外,对于
new_layer
函数,您可以只使用
np.random.rand(N,N)>p
(不确定实际分布是否与您的完全相同)

a[a.astype(bool)] = colors[np.indices(a.shape)[0][a.astype(bool)]]