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)
但这不起作用......
提前致谢!
如果您对阵列的排序没有保证,那么您可以使用以下方法进行合理有效的实施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)
| 归档时间: |
|
| 查看次数: |
8047 次 |
| 最近记录: |