Нахождение количества уникальных тройки в Numpy Ndarray - PullRequest
0 голосов
/ 08 октября 2019

У меня есть какое-то изображение в виде ndarray, например:

# **INPUT**
img = np.array(
[
    [
        [0, 0, 255],
        [0, 0, 255],
        [0, 0, 255],
        [0, 0, 255],
        [0, 0, 255],
        [0, 0, 255],
        [0, 0, 255],
        [0, 0, 255]
    ],
    [
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [0, 255, 0],
        [0, 255, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0]
    ],
    [
        [255, 0, 0],
        [0, 255, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0]
    ],
    [
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0],
        [255, 0, 0]
    ],
])

Мне нужно найти количество каждого цвета в моем изображении, то есть количество из трех следующих кортежей: [0, 0, 255], [255, 0, 0], [0, 255, 0] . В этом случае:

# **Desired OUTPUT**
 unique  [[  0   0 255]
 [255   0   0]
 [  0 255   0]]
 counts  [8 21 3]

это то, что я сделал:

print('AXIS 0 -----------------------------------')
unique0, counts0 = np.unique(img, axis=0, return_counts=True)
print('unique0 ', unique0)
print('counts0 ', counts0)

Это вывод:

  AXIS 0 -----------------------------------
  unique0  [[[  0   0 255]
  [  0   0 255]
  [  0   0 255]
  [  0   0 255]
  [  0   0 255]
  [  0   0 255]
  [  0   0 255]
  [  0   0 255]]

 [[255   0   0]
  [  0 255   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]]

 [[255   0   0]
  [255   0   0]
  [255   0   0]
  [  0 255   0]
  [  0 255   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]]

 [[255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]
  [255   0   0]]]
counts0  [1 1 1 1]

Я получаю аналогичный результат при попытке сaxis=1 (count1 [2 1 5]).

Я также попытался указать кортеж в качестве входного значения оси, axis=(0, 1), который возвращает ошибку TypeError: an integer is required (got type tuple).

Любые идеи, чтоЯ делаю не так?

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Начните с использования np.concatenate, чтобы объединить ndarray вдоль первой оси, и затем используйте np.unique, как вы делаете, устанавливая return_counts=True, который будет возвращать счетчики уплощенного массива 2D:

unique, counts = np.unique(np.concatenate(mg), axis=0, return_counts=True)

print(unique)
[[  0   0 255]
 [  0 255   0]
 [255   0   0]]

print(counts)
# array([ 8,  3, 21], dtype=int64)
2 голосов
/ 08 октября 2019

Вы можете сделать:

elements, counts = np.unique(img.reshape((-1, 3)), axis=0, return_counts=True)
print(elements, counts)

Вывод

[[  0   0 255]
 [  0 255   0]
 [255   0   0]] [ 8  3 21]
...