【问题标题】:Change the content of the array in python在python中更改数组的内容
【发布时间】:2020-07-19 08:53:30
【问题描述】:

我有一个多维数组(我们称之为“数据”),我打印它产生这样的结果

[[[255, 255, 255]
  [255, 255, 255]
  [0, 0, 0]
  [255, 255, 255]]
 [[0, 0, 0]
  [255, 255, 255]
  [0, 0, 0]
  [0, 0, 0]]
  ... and so on
  [255, 255, 255]]]

我想像这样更改数据的内容

[[1,
  1,
  0,
  1]
 [0,
  1,
  0,
  0]
  ... and so on
  1]]

[255, 255, 255] 变为 1,并且 [0, 0, 0]变成0

我正在尝试使用numpy.where,但我很绝望 在python编程中如何做到这一点?

【问题讨论】:

  • 是否会出现数字是其他东西的情况?或者您是否严格检查 3x255 和 3x0 之间?
  • 在您的第一个代码块上,您是指[255, 255, 255] 还是"[255 255 255]"
  • @Alilshaq 介于 3x255 和 3x0 之间
  • @baby idk 是肯定的,但是打印出来的结果是这样的

标签: python arrays numpy image-processing numpy-ndarray


【解决方案1】:

一种方法是检查一个值是否为255,并使用np.logical_and 减少布尔结果

np.logical_and.reduce(a==255, axis=2).view('i1') 

以下示例:

a = np.array([[[255, 255 ,255],
               [255, 255, 255],
               [0 ,0, 0],
               [255, 255 ,255]],
              [[0 ,0, 0],
               [255, 255 ,255],
               [0 ,0, 0],
               [0 ,0, 0]]])

np.logical_and.reduce(a==255, axis=2).view('i1') 

array([[1, 1, 0, 1],
       [0, 1, 0, 0]], dtype=int8)

【讨论】:

  • 谢谢,它有效。我有另一个问题。为什么打印时的输出是[255 255 255][1 1 1],而不是[255, 255, 255]
  • 对不起,我不太明白你的意思。 @IrchamAjiNugroho
  • 对不起我的英语不好和解释:我找到了答案
【解决方案2】:

我会这样做:

使用tuple(col) == (255, 255, 255) 很重要,因为具有多个元素的数组的真值是不明确的。

data = np.asarray(im) # (assuming this is how you got your data)

new_data = np.array(np.zeros((len(data),len(data[0]))))

for x,row in enumerate(data):
    for y,col in enumerate(row):
        if tuple(col) == (255, 255, 255):
            new_data[x][y] = 1

print(new_data)

或者在一行中:

new_data = [[1 if tuple(col) == (255, 255, 255) else 0 for col in row] for row in data]

第一个将产生一个 numpy 数组,第二个将产生一个列表。但是,您可以使用以下方法将其转换为 numpy 数组:

new_data = np.array([[1 if tuple(col) == (255, 255, 255) else 0 for col in row] for row in data])

【讨论】:

    【解决方案3】:

    试试这个:

    data = [
        [
            [255, 255, 255],
            [255, 255, 255],
            [0, 0, 0],
            [255, 255, 255]
        ],
        [
            [0, 0, 0],
            [255, 255, 255],
            [0, 0, 0],
            [0, 0, 0],
        ],
        [
            [255, 255, 255],
            [255, 255, 255],
            [0, 0, 0],
            [0, 0, 0],
        ]
    ]
    
    result = [[1 if y == [255, 255, 255] else 0 for y in x] for x in data]
    print(result)
    

    请记住,如果唯一可能的值是 [255, 255, 255][0, 0, 0],它将起作用(这是我从问题中理解的)

    【讨论】:

    • 我会选择这个答案。
    • 如果有 numpy 函数可以做同样的事情,那么使用列表和循环方法来处理 numpy 数组绝不是可行的方法。如果您比较较大阵列上的性能,您会看到巨大的差异
    • 如您所说,这对大型阵列很重要,但 OP 没有提到他的数据规模,所以恕我直言,这是最简单的解决方案。
    • 255 和 0s... 这是用于图像数据的。通常的尺寸是 1024x1024 的数量级,这已经可以为单个图像提供 1048576 个不同的数据点,并且考虑到单个通道。对于图像数据,如果您想要一个性能合理的方法,那么使用高度优化的 numpy 和 scipy 函数至关重要,而这在 python 级别的循环中是不可能的。
    • 顺便谢谢一张图片的像素数组大小
    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 2012-09-22
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多