我有2个数组,如下所示:
l=
array([[1205, 1420, 1340],
[1306, 1530, 1045],
[2001, 135, 1207],
...]])
y=
array([[1200, 1320, 2001],
[1306, 1530, 1045],
...,
[ 0, 3, 0]])
我想找到最快的方法,用[1000,1000,1000]替换y中的l中的值(子数组)。
例如,我会得到:
l=
array([[1205, 1420, 1340],
[1000, 1000, 1000],
[2001, 135, 1207],
...]])
到目前为止,我已经尝试了使用'if'条件的'for'循环,但这需要太多时间。
感谢您的建议。
答案 0 :(得分:4)
我们可以使用views
将每一行视为一个元素,然后使用np.isin
获得 presence 的布尔数组,用它来索引并最终分配-< / p>
# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
a = np.ascontiguousarray(a)
b = np.ascontiguousarray(b)
void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
return a.view(void_dt).ravel(), b.view(void_dt).ravel()
l1D,y1D = view1D(l,y)
l[np.isin(l1D, y1D)] = [1000,1000,1000]
样品运行-
In [36]: l
Out[36]:
array([[1205, 1420, 1340],
[1306, 1530, 1045],
[2001, 135, 1207],
[ 2, 3, 4]])
In [37]: y
Out[37]:
array([[1200, 1320, 2001],
[1306, 1530, 1045],
[ 0, 3, 0]])
In [38]: l1D,y1D = view1D(l,y)
In [39]: l[np.isin(l1D, y1D)] = [1000,1000,1000]
In [40]: l
Out[40]:
array([[1205, 1420, 1340],
[1000, 1000, 1000],
[2001, 135, 1207],
[ 2, 3, 4]])