Numpy数组一次修改多个元素

Ban*_*ank 2 python indexing numpy

我有三个numpy数组:

row = np.array([1,2,3,4,5])

# a is a subset of row:

a = np.array([1, 5])

# b is an array that I use to change some elements in the first row array:

b = np.array([10, 550])
Run Code Online (Sandbox Code Playgroud)

我需要做的是一次性改变a对应的b元素中存在的行数组的元素.

即:

>> modified_row
array([10, 2, 3, 4, 500])
Run Code Online (Sandbox Code Playgroud)

以天真的方式这样做将是:

for i in range(len(a)):
    row[np.where(row==a[i])]= b[i]
Run Code Online (Sandbox Code Playgroud)

我想要一个解决方案;

row[np.where(row==a)] = b
Run Code Online (Sandbox Code Playgroud)

但这不起作用......

提前致谢!

Jai*_*ime 5

如果您对阵列的排序没有保证,那么您可以使用以下方法进行合理有效的实施np.searchsorted:

def find_and_replace(array, find, replace):
    sort_idx = np.argsort(array)
    where_ = np.take(sort_idx, 
                     np.searchsorted(array, find, sorter=sort_idx))
    if not np.all(array[where_] == find):
        raise ValueError('All items in find must be in array')
    row[where_] = b
Run Code Online (Sandbox Code Playgroud)

唯一不能处理的是重复输入array,但除此之外它就像一个魅力:

>>> row = np.array([5,4,3,2,1])
>>> a = np.array([5, 1])
>>> b = np.array([10, 550])
>>> find_and_replace(row, a, b)
>>> row
array([ 10,   4,   3,   2, 550])

>>> row = np.array([5,4,3,2,1])
>>> a = np.array([1, 5])
>>> b = np.array([10, 550])
>>> find_and_replace(row, a, b)
>>> row
array([550,   4,   3,   2,  10])

>>> row = np.array([4, 5, 1, 3, 2])
>>> find_and_replace(row, a, b)
>>> row
array([  4, 550,  10,   3,   2])
Run Code Online (Sandbox Code Playgroud)