【问题标题】:Mapping data between arrays of different shape在不同形状的数组之间映射数据
【发布时间】:2020-05-29 18:21:13
【问题描述】:

我有一个形状为(256,256,3) 的数据数组,其中轴(0,1) 上的每个值的值都为[1,0,0], [0,1,0],[0,0,1][1,1,0]

我想将其转换为形状为(256,256,4) 的数组,其中的值映射如下:

[1,0,0] -> [1,0,0,0]
[0,1,0] -> [0,1,0,0]
[0,0,1] -> [0,0,1,0]
[1,1,0] -> [0,0,0,1]

我尝试使用如下循环,但它不起作用。

for element in original_array:
    if element == [1, 0, 0]:
        new_array[:,:,0] = 1
    elif element == [0, 1, 0]:
        new_aray[:,:,1] = 1
    elif element == [0, 0, 1]:
        new_array[:,:,2] = 1
    elif element == [1, 1, 0]:
        new_array[:,:,3] = 1

我也尝试过这样的代码,但我不确定如何正确实现它:

new_array[:,:,0][original_array == [1,0,0]] = 1
new_array[:,:,1][original_array == [0,1,0]] = 1
new_array[:,:,2][original_array == [0,0,1]] = 1
new_array[:,:,3][original_array == [1,1,0]] = 1

我如何正确实现这两种方法,我可以使用哪些替代方法来完成这项任务?

【问题讨论】:

  • 它是一个与问题相关的 3 维列表吗?您不只是替换最嵌套的列表吗?所以,如果你有一些代码在你的第一个代码块中提供了映射,那是一个可以接受的解决方案吗?

标签: python arrays numpy mapping


【解决方案1】:

让我们重现问题:

a = numpy.array([[1,0,0], [0,1,0], [0,0,1], [1,1,0]])
b = a[numpy.random.randint(0,4,256*256)].reshape(256,256,3)

我们可以将您的原始数组插入到最后一个轴上大小为 4 的零数组中:

c = numpy.zeros((b.shape[0], b.shape[1], 4))
c[:,:,:3] = b

然后寻找我们在索引 0 和 1 处有 1 的情况,并将第四列设置为 1,其中 True。

c[:,:,3] = b[:,:,:2].all(axis=-1)

这使用了True 和 1 之间的等价关系(右侧是一个布尔数组,但我们将其分配给一个浮点数组,其值为 1)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2013-11-07
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多