請注意@ Jaime的答案更好 - 儘管它依賴於元素的排序,但它被標記爲正確。這是一個工作版本,不會在原地修改row
,否則將在一般情況下工作。在這篇文章的最後是我的原始答案。
import numpy as np
def replaced(row, a, b):
row_order = row.argsort()
a_order = a.argsort()
sorted_row = row[row_order]
sorted_a = a[a_order]
sorted_b = b[a_order]
sorted_row[np.in1d(sorted_row, sorted_a)] = sorted_b
# return results in original order
return sorted_row[row_order.argsort()]
a = np.array([1, 5])
b = np.array([10, 550])
row = np.array([1,2,3,4,5])
print replaced(row, a, b)
row = np.array([5,4,3,2,1])
print replaced(row, a, b)
row = np.array([4, 5, 1, 3, 2])
print replaced(row, a, b)
結果:
>>> row = np.array([1,2,3,4,5])
>>> print replaced(row, a, b)
[ 10 2 3 4 550]
>>>
>>> row = np.array([5,4,3,2,1])
>>> print replaced(row, a, b)
[550 4 3 2 10]
>>>
>>> row = np.array([4, 5, 1, 3, 2])
>>> print replaced(row, a, b)
[ 4 550 10 3 2]
ORIGINAL不正確的答案要做到這一點
的一種方法是用in1d
功能,這將產生一個布爾數組,您可以使用索引row
爲如下所示。
注意,你可能有這個問題(以及其他方法)如果row
元素不是唯一的,或者如果你已經在a
>>> import numpy as np
>>> row = np.array([1,2,3,4,5])
>>> a = np.array([1, 5])
>>> b = np.array([10, 550])
>>> np.in1d(row, a)
array([ True, False, False, False, True], dtype=bool)
>>> row[np.in1d(row, a)] = b
>>> row
array([ 10, 2, 3, 4, 550])
重複的元素就可以正常使用任何索引/布爾數組你最初用於提取a
也爲此目的。
您能說明您對重複元素的預期行爲嗎? – wim
@wim,事實是,對於我的問題,所有元素都是唯一的,排序不是問題,因爲這些值本身就是索引。 – BangTheBank