【问题标题】:How to center the nonzero values within 2D numpy array?如何在二维 numpy 数组中居中非零值?
【发布时间】:2018-08-06 23:39:01
【问题描述】:

我想在 2D numpy 数组中定位所有非零值并移动它们以使图像居中。我不想填充数组,因为我需要保持它相同的形状。例如:

my_array = np.array([[1, 1, 0, 0], [0, 0, 2, 4], [0, 0, 0, 0], [0, 0, 0, 0]])
# center...

>>> [[0 0 0 0]
     [0 1 1 0]
     [0 2 4 0]
     [0 0 0 0]]

但实际上我需要居中的数组要大得多(比如 200x200、403x403 等,它们都是方形的)。我认为np.nonzero 和np.roll 可能会派上用场,但我不确定将它们用于我的大型阵列的最佳方式。

【问题讨论】:

  • 你如何定义处于中心位置?
  • @Tai 我想理想情况下我想将图像质心的坐标设置为等于原点(假设我已经有了质心的坐标)。
  • 您是否已经想出了解决较小矩阵的方法?如果是这样,你应该与人分享。此外,更多示例将对人们有所帮助。
  • 还没有。我说我已经有了质心坐标的原因是因为我正在使用astropy 包photutils,它具有返回图像中对象质心坐标的功能。
  • 行是独立的吗?从您提供的示例中,似乎该行首先一个一个居中,然后 bloc [[1 1][2 4]] 垂直居中...

标签: python arrays python-3.x numpy


【解决方案1】:

nonzero 和roll 的组合可用于此目的。例如,如果k=0 在下面显示的循环中,则np.any 将识别不完全为零的行。记录第一行和最后一行,并计算沿轴的偏移,以便在偏移之后,(first+last)/2 将移动到数组的中间行。然后对列进行相同的操作。

import numpy as np
my_array = np.array([[1, 1, 0, 0], [2, 4, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
print(my_array)   # before
for k in range(2):
    nonempty = np.nonzero(np.any(my_array, axis=1-k))[0]
    first, last = nonempty.min(), nonempty.max()
    shift = (my_array.shape[k] - first - last)//2
    my_array = np.roll(my_array, shift, axis=k)
print(my_array)   # after

之前:

[[1 1 0 0]
 [2 4 0 0]
 [0 0 0 0]
 [0 0 0 0]]

之后:

[[0 0 0 0]
 [0 1 1 0]
 [0 2 4 0]
 [0 0 0 0]]

替代方案:np.count_nonzeros 可以用来代替np.any,这允许潜在地为非零像素的数量设置一些阈值,这些像素被认为“足够”将一行限定为图像的一部分。

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多