使用查找更改数组值 table
Change array values using lookup table
我有一个 numpy 二维整数数组:
a = numpy.array([[1, 1, 2, 2],
[0, 1, 2, 2],
[1, 3, 2, 3]])
我有一个包含原始值和新值的查找 table(元组列表):
lookup = [(0, 1),
(1, 0),
(2, 255)]
我的任务是根据查找对原始数组进行重新分类table:
原始数组中的所有零都应该变成一个,所有的都应该变成零,所有值==2应该变成255,其他值应该保持不变。预期结果是:
[[0, 0, 255, 255],
[1, 0, 255, 255],
[0, 3, 255, 3]]
我尝试了以下解决方案:
for row in lookup:
original_value = row[0]
new_value = row[1]
a[a == original_value] = new_value
但是,我没有得到想要的结果,上面操作的结果是:
[[0, 0, 255, 255],
[0, 0, 255, 255],
[0, 3, 255, 3]]
注意 result[1, 0] 是 0 但应该是 1.
是否有方法(嵌套循环除外)使用我的查找更改原始数组中的值table?
我认为这行得通:
a = np.array([[1, 1, 2, 2],
[0, 1, 2, 2],
[1, 3, 2, 3]])
lookup = [(0, 1),
(1, 0),
(2, 255)]
result = (a == 0) + (a == 2) * 255 + (a != 1) * (a != 0) * (a != 2) * a
您得到以下结果:
array([[ 0, 0, 255, 255],
[ 1, 0, 255, 255],
[ 0, 3, 255, 3]])
您可以复制数组 'a',在 'for' 循环中保持不变:
a = np.array([[1, 1, 2, 2],
[0, 1, 2, 2],
[1, 3, 2, 3]])
lookup = [(0, 1),
(1, 0),
(2, 255)]
a_copy = np.copy(a)
for row in lookup:
original_value = row[0]
new_value = row[1]
a[a_copy == original_value] = new_value
你可以这样做:
import numpy as np
a = np.array([[1, 1, 2, 2],
[0, 1, 2, 2],
[1, 3, 2, 3]])
lookup = [(0, 1),
(1, 0),
(2, 255)]
lookup = np.asarray(lookup)
replacer = np.arange(a.max() + 1)
replacer[lookup[:, 0]] = lookup[:, 1]
result = replacer[a]
print(result)
输出:
[[ 0 0 255 255]
[ 1 0 255 255]
[ 0 3 255 3]]
我有一个 numpy 二维整数数组:
a = numpy.array([[1, 1, 2, 2],
[0, 1, 2, 2],
[1, 3, 2, 3]])
我有一个包含原始值和新值的查找 table(元组列表):
lookup = [(0, 1),
(1, 0),
(2, 255)]
我的任务是根据查找对原始数组进行重新分类table: 原始数组中的所有零都应该变成一个,所有的都应该变成零,所有值==2应该变成255,其他值应该保持不变。预期结果是:
[[0, 0, 255, 255],
[1, 0, 255, 255],
[0, 3, 255, 3]]
我尝试了以下解决方案:
for row in lookup:
original_value = row[0]
new_value = row[1]
a[a == original_value] = new_value
但是,我没有得到想要的结果,上面操作的结果是:
[[0, 0, 255, 255],
[0, 0, 255, 255],
[0, 3, 255, 3]]
注意 result[1, 0] 是 0 但应该是 1.
是否有方法(嵌套循环除外)使用我的查找更改原始数组中的值table?
我认为这行得通:
a = np.array([[1, 1, 2, 2],
[0, 1, 2, 2],
[1, 3, 2, 3]])
lookup = [(0, 1),
(1, 0),
(2, 255)]
result = (a == 0) + (a == 2) * 255 + (a != 1) * (a != 0) * (a != 2) * a
您得到以下结果:
array([[ 0, 0, 255, 255],
[ 1, 0, 255, 255],
[ 0, 3, 255, 3]])
您可以复制数组 'a',在 'for' 循环中保持不变:
a = np.array([[1, 1, 2, 2],
[0, 1, 2, 2],
[1, 3, 2, 3]])
lookup = [(0, 1),
(1, 0),
(2, 255)]
a_copy = np.copy(a)
for row in lookup:
original_value = row[0]
new_value = row[1]
a[a_copy == original_value] = new_value
你可以这样做:
import numpy as np
a = np.array([[1, 1, 2, 2],
[0, 1, 2, 2],
[1, 3, 2, 3]])
lookup = [(0, 1),
(1, 0),
(2, 255)]
lookup = np.asarray(lookup)
replacer = np.arange(a.max() + 1)
replacer[lookup[:, 0]] = lookup[:, 1]
result = replacer[a]
print(result)
输出:
[[ 0 0 255 255]
[ 1 0 255 255]
[ 0 3 255 3]]